Сьогодні я помітив, що Chrome 49 більше не виводиться NaN
під час введення {}+{}
в консоль. Натомість він виводить рядок [object Object][object Object]
.
Чому це? Чи змінилася мова?
Сьогодні я помітив, що Chrome 49 більше не виводиться NaN
під час введення {}+{}
в консоль. Натомість він виводить рядок [object Object][object Object]
.
Чому це? Чи змінилася мова?
Відповіді:
Тепер розробники Chrome автоматично загортають все, що починається {
і закінчується, }
в неявну пару дужок ( див. Код ), щоб змусити його оцінювати як вираз. Таким чином, {}
створює порожній об’єкт зараз. Це можна побачити, якщо ви повернетесь до історії ( ↑), попередній рядок міститиметься в (…)
.
Чому? Я не знаю, але я можу здогадатися, що це зменшує плутанину для новачків, які не знають про буквальний предмет блок-vs-об’єкт-буквально, а також корисніше, якщо ви просто хочете оцінити вираз.
Насправді це міркування, про які йдеться у помилці 499864 . Чиста зручність. А тому, що у вузла REPL його було також ( див. Код ).
{a:1}),({b:2}
повинен кидати помилку, а не створювати об'єкт.
)
у випадку, якщо він є в коментарі, наприклад, {a:3} // :-}
можливо, все-таки створюється об’єкт.
Якщо натиснути стрілку вгору після перевірки, ви помітите, що замість {} + {}
неї відображається ({} + {})
, що призводить до "[object Object][object Object]"
.
Для порівняння, у Firefox {} + {}
все ще відображається NaN
, але якщо ви ({} + {})
це зробите, він також відображається "[object Object][object Object]"
.
Отже, схоже, Chrome автоматично додає навколишні дужки, коли бачить цю операцію.
{} + {}
коли не "санітована" до ({} + {})
, трактується як + {}
тому {}
, що аналізується як порожній блок.
{}
код є лише порожнім кодом блоку і не враховується, залишаючи нас +{}
, що є унарним +
і порожнім об'єктом ініціалізатор. +
буде примушувати свій аргумент до числа, що включає перетворення об'єкта в примітив (що в кінцевому підсумку toString
в цьому випадку буде результатом "[object Object]"
), і таким чином ми отримаємо +"[object Object]"
це, NaN
тому що "[object Object]"
не може бути перетворене на дійсне число.
На жаль, я сам додав цитату Clippy. Консоль не дає інформації про те, що вона зробила для вас.
Нові правила неймовірно прості, рятуючи нас від клопоту, щоб наполегливо набрати ці 2 складні графіки o=
або 0,
перед тим, як вставити Об'єктні літерали в консоль:
{
;{wat:1}),({wat:2}
Зрештою, помилка знову.
{let i=0;var increment=_=>i++}
Нарешті, це правильно дозволено, нарешті, що є досить приємним способом робити закриття.
Однак, це неправильно об'єкт, це лише зручність, як згадує @Bergi, він інтерпретує JS неправильно, щоб допомогти вам! Спеціалізація каже, що це блок із міченим твердженням "foo" з буквальним 1, який не призначений ні до чого.
{foo:1}
Вищенаведене має бути таким же, як
if(1) {
foo: 1
}
Далі трактується правильно як блок ... тому що перед ним є коментар!
//magic comment
{foo:1}
Так це:
{foo:1}
//also magic
Це Об'єкт:
{foo:
//not so magic comment
1}
Це помилка
//not so magic comment
{foo:1}.foo
Так це:
{foo:1}.foo
Це добре:
1..wat
undefined
так це:
['foo'][0]
Наступний правильно інтерпретується як об'єкт, що потрапив у позицію вираження, а 0,
це, як правило, те, як ми однозначно гарантуємо, що замість висловлювання є вираз.
0,{foo:1}.foo
Я не розумію, чому вони обертають цінність у паронах. JS має кілька смішних дизайнерських рішень, але намагатися змусити себе вести себе приємніше в цій одній ситуації - це насправді не варіант, консолі потрібно запустити JS правильно, і ми повинні бути впевнені, що хром не просто здогадується, що він думає, що ми думаємо насправді означало це зробити щось інше.
Якщо вам не подобаються оператори з комами, ви можете використовувати призначення
x = {foo:1}.foo
Бо як стоїть
{} + {} + {}
"[object Object][object Object][object Object]"
;{} + {} + {}
"NaN[object Object]"
Божевільний і послідовний, з яким я можу мати справу ... божевільний і непослідовний, не дякую!
{foo:1}
і {foo:1}//
виробляють те саме. У Chrome JS REPL це не так. REPL робить більше, ніж просто оцінювати JS. Це обробка струн і вирішення різних речей.
var x = eval('{a:1}')
У дійсному JavaScript x зараз 1, не інтуїтивніший об’єкт {a: 1}. Так, це дивно, але ви не можете просто змінити мову, оскільки це робить дивні речі. Все, крім рядків JSON, інтерпретується як JavaScript та оцінюється. Введення тексту 0,
перед тим, як вставити JSON, не є складним, але я також буду радий попереджати, що рядок інтерпретується як об'єкт замість JavaScript для зручності.
var e = {}; e.toString()
і ви побачите, що я маю на увазі