【问题标题】:What is the correct Javascript operator precedence table?什么是正确的 Javascript 运算符优先级表?
【发布时间】:2019-08-05 16:05:38
【问题描述】:

如果我在 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,表示从右到左进行评估。所以这个优先表也不正确。

谁能给我一个正确的表格?

【问题讨论】:

标签: javascript operators operator-precedence


【解决方案1】:

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence$revision/510297#Table new Number 应该首先评估。所以我认为这张表是不正确的。

new 运算符很复杂。让我们检查一下official language grammar:它确实有两种表现形式:

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 似乎过度简化了后缀运算符的优先级。

谁能给我一个正确的表格?

试试my new revision of MDN's table

【讨论】:

  • this revision 中的 MDN 表是正确的,但后来变得不正确。我现在已经修好了,请检查你是否能看懂新表(以及我是否仍然忽略了一些东西)
  • new new Function 怎么样?我认为现在需要关联性。
  • 是的,它是从右到左关联的:new (new (Function)))。我忘记了吗?
  • 我的意思是 new new Function()() 。我每天都使用它。 ;)
  • @Taurus 我再说一遍:运算符优先级(a+b*c 是指(a+b)*c 还是a+(b*c))与操作数评估顺序无关(总是从左到右)在 JavaScript 中:a 然后 b 然后 c)。
【解决方案2】:

这是 MDN 的完整运算符优先级表,可在 your link 获得:

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2016-11-18
    • 2015-07-19
    相关资源
    最近更新 更多