Это на самом деле не связано с JavaScript или браузерами, а именно с тем, как Chrome DevTools анализирует выражения.Если вы выполняете свой код в обычном скрипте, вы не столкнетесь с таким поведением.Я немного наткнулся на то, почему в этом ответе .
Вот что происходит:
key = 'value' // "value"
это определяет переменную (в глобальной области в нестрогомmode) и присваивает ему значение.
{key} // {key: "value"}
Это блок, devtools Chrome видит это и оборачивает объект .Он запускает регулярное выражение для вашего кода и специально проверяет, выглядит ли он как литерал объекта:
try {
// Check if the code can be interpreted as an expression.
parse('return ' + code + ';');
// No syntax error! Does it work parenthesized?
const wrappedCode = '(' + code + ')';
parse(wrappedCode);
return wrappedCode;
} catch (e) {
return code;
}
Что можно интерпретировать так, что {key}
преобразуется в ({key})
, который является литералом объектаи работает.
{key}; // semicolon is only diff, "value"
С другой стороны, в конце точка с запятой, так как приведенный выше код преобразует его в ({key};)
, который является недопустимым JavaScript, код предварительной обработки в Chrome devtools вводится в catch
и возвращает исходный код.
Это оператор , а не выражение.По сути анализируется как:
{
key;
}
В JavaScript у каждого оператора есть «секретное» значение, и вы просто видите результат регистрации последнего значения сценария, который вам дает REPL - в данном случае строка.