(4 || x = 5) ReferenceError вместо SyntaxError - PullRequest
0 голосов
/ 29 ноября 2018

Почему следующий код возвращает ReferenceError вместо SyntaxError?

4 || x = 5; // Uncaught ReferenceError: Invalid left-hand side in assignment

Вот как определяется AssignmentExpression в соответствии с ECMAScript 5.1 :

AssignmentExpression :
    ConditionalExpression
    LeftHandSideExpression = AssignmentExpression
    LeftHandSideExpression AssignmentOperator AssignmentExpression

В этом случае 4 || x - это не LeftHandSideExpression , а LogicalORExpression, который не включен в LeftHandSideExpression.Как работает парсер?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Интересная находка!Я считаю, что сканер читает слева направо.Сначала оценивается 4 || x.Результатом этого выражения всегда будет 4, поскольку 4 является "правдивым".Таким образом, затем он оценивает 4 = 5, что выдает ошибку, поскольку вы не можете переопределить значение целого числа.

Подробнее о порядке старшинства здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

0 голосов
/ 29 ноября 2018

Это синтаксически неверно, и по спецификации вы должны получить SyntaxError, но ваш браузер странно относится к типу исключения.

Вы должны получить ранний ReferenceErrorдля случаев типа

1 = 2;

, где грамматика говорит, что левая сторона в порядке, но левая часть не является ни литералом массива, ни литералом объекта, а IsValidSimpleAssignmentTarget не соответствует действительностидля левой стороны.Вы должны получить SyntaxError, когда грамматика отклоняет ваш код (и в некоторых других случаях тоже).Похоже, ваш браузер использует слишком разрешающую версию LeftHandSideExpression и отфильтровывает грамматически неверные левые части в той же проверке, что и IsValidSimpleAssignmentTarget, и выдает ту же ошибку.

0 голосов
/ 29 ноября 2018

Мои знания JavaScript говорят мне, что "=" имеет меньший приоритет, чем логическое ИЛИ "||"вот почему вы получаете ReferenceError ..

делая это:

4 || (x = 5)

вы вообще не получаете ошибку

отредактировано: внимательно читаете ваш вопрос ... что выдействительно хочу знать, как работает синтаксический анализатор ... ну .. JS - интерпретируемый язык и пытается быть быстрым, поэтому ... когда он находит

true || destroyWorld() // will never be called.. actually..the parser will never read it

, когда я добавил круглые скобки, я увеличил приоритетцелое выражение ... оператор присваивания имеет один из самых низких

(проверьте ссылку в другом ответе)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...