Сегодня я заметил, что Chrome 49 больше не выводит NaN
при вводе {}+{}
в консоль. Вместо этого выводится строка [object Object][object Object]
.
Почему это? Изменился ли язык?
Сегодня я заметил, что Chrome 49 больше не выводит NaN
при вводе {}+{}
в консоль. Вместо этого выводится строка [object Object][object Object]
.
Почему это? Изменился ли язык?
Chrome devtools теперь автоматически переносит все, что начинается с {
и заканчивается }
в неявной паре скобок (см. код), чтобы заставить его оценивать как выражение. Таким образом, {}
создает пустой объект. Вы можете увидеть это, если вернуться к истории ( ↑), предыдущая строка будет содержаться в (...)
.
Почему? Я не знаю, но Я мог догадаться, что это уменьшает путаницу для новичков, которые не знают об объекте block-vs-object-literal, и это также более полезно, если вы просто хотите оценить выражение.
И на самом деле это рассуждение, как описано в ошибке 499864. Чистое удобство. И поскольку node REPL имел его (см. код).
Если вы нажмете стрелку вверх после ее проверки, вы заметите, что вместо {} + {}
отображается ({} + {})
, что приводит к "[object Object][object Object]"
.
Для сравнения, в Firefox {} + {}
по-прежнему отображается NaN
, но если вы делаете ({} + {})
, то также отображается "[object Object][object Object]"
.
Итак, похоже, что Chrome добавляет окружающие круглые скобки автоматически, когда видит эту операцию.
К сожалению, я добавил цитату Clippy. Консоль не дает информации о том, что она сделала для вас.
Новые правила невероятно просто спасают нас от тяжелой работы с этими двумя сложными символами o=
или 0,
перед тем, как вставить в Линейку Object Literals:
{
; {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
Я не понимаю, почему они переносят значение в parens. У JS есть некоторые смешные дизайнерские решения, но попытка заставить его вести себя лучше в этой ситуации, на самом деле это не вариант, консоль должна правильно запускать JS, и нам нужно быть уверенным, что хром не просто догадывается, что он думает, что мы действительно означало, что он сделал что-то еще.
Если вам не нравятся операторы запятой, вы можете использовать назначение
x = {foo:1}.foo
Потому что, поскольку он стоит
{} + {} + {}
"[object Object][object Object][object Object]"
;{} + {} + {}
"NaN[object Object]"
Сумасшедший и последовательный я могу справиться... сумасшедший и непоследовательный нет спасибо!