Какова правильная таблица приоритетов операторов Javascript?

Если я запустил следующий код в Firefox, я получаю сообщение об ошибке:

new Number.toString;

Но в соответствии с MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence new Number должен оцениваться первым. Я думаю, что таблица неправильная.

Посмотрим на MSDN: http://msdn.microsoft.com/en-us/library/z3ks45k7(v=vs.94).aspx. Над таблицей написано, что операторы оцениваются слева направо. Но:

a=1;
b=a=2;

Теперь b имеет значение 2, которое предлагает оценку справа налево. Так что эта таблица приоритетов неверна.

Может ли кто-нибудь дать мне правильный стол?

Ответ 1

согласно https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence$revision/510297# Таблица new Number должна оцениваться в первую очередь. Я думаю, что таблица неправильная.

Оператор new сложный. Давайте проверим официальную грамматику языка: Это происходит в двух проявлениях:

MemberExpression := new MemberExpression Arguments | …
NewExpression := new NewExpression | …

Последний, где вызывается без аргументов, действительно имеет меньший приоритет, чем аксессоры свойств, так что ваше выражение оценивается как new (Number.toString). Однако, когда new вызывается с аргументами (скобки), то он имеет больший приоритет, чем CallExpression, и равен атрибуту доступа к свойствам, и в этом случае они будут оценивать слева направо. Действительно, таблица MDN должна сделать это более понятным.

Посмотрим на MSDN: http://msdn.microsoft.com/en-us/library/z3ks45k7(v=vs.94).aspx. Над таблицей написано, что операторы оцениваются слева направо.

Это определенно неправильно. Ассоциативность операторов не всегда слева направо, наиболее очевидна для операторов присваивания, как в вашем примере. В таблице MDN это верно. Кроме того, MSDN, похоже, упрощает приоритет постфиксных операторов.

Может ли кто-нибудь дать мне правильный стол?

Попробуйте мою новую ревизию таблицы MDN.