ES2018 进修笔记(2)&& 和 || 的运算优先级

为何 && 比 || 优先级高?

原由

有时在网上搜刮 js 运算符优先级,险些每一个版本都通知读者 &&|| 优先级更高,包括 MSN 如许的威望网站也不破例。

这与本身履历不符 —— 它们应该是优先级一样的。

论证

0 || 1 && 0 || 2

// 按 && 优先级高
( 0 || ( 1 && 0 ) ) || 2

// 按优先级一致

0 || ( 1 && ( 0 || 2 ) )

不管怎样实行效果都一样

狡辩

由于有 MDN 背书,中英文版本都是一样,心想这事变不会那末简朴。因而,翻开 ES 范例来找寻原形。

12.13 Binary Logical Operators

Syntax

LogicalANDExpression[In, Yield, Await] :

  • BitwiseORExpression [?In, ?Yield, ?Await]
  • LogicalANDExpression [?In, ?Yield, ?Await] && BitwiseORExpression [?In, ?Yield, ?Await]

LogicalORExpression[In, Yield, Await]:

  • LogicalANDExpression [?In, ?Yield, ?Await]
  • LogicalORExpression [?In, ?Yield, ?Await] || LogicalANDExpression [?In, ?Yield, ?Await]

细细品品以上定义,会发明逻辑或表达式包括逻辑与表达式。再来看看的求值历程:

12.13.3 Runtime Semantics: Evaluation

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression

  • Let lref be the result of evaluating LogicalANDExpression.
  • Let lval be ? GetValue(lref).
  • Let lbool be ToBoolean(lval).
  • If lbool is false, return lval.
  • Let rref be the result of evaluating BitwiseORExpression.
  • Return ? GetValue(rref).

LogicalORExpression : LogicalORExpression || LogicalANDExpression

  • Let lref be the result of evaluating LogicalORExpression.
  • Let lval be ? GetValue(lref).
  • Let lbool be ToBoolean(lval).
  • If lbool is true, return lval.
  • Let rref be the result of evaluating LogicalANDExpression.
  • Return ? GetValue(rref).

回看最先的例子里的语句 0 || 1 && 0 || 2

  • 依据定义这是一条逻辑或表达式
  • 实行逻辑等价于 ( 0 || ( 1 && 0 ) ) || 2

这么明白,就相符 && 优先级更高的说法。

总结

来个复杂点的

0 || 1 && 0 || 2 && 3 && 0 || 1 && 0  

根据范例来实行

( ( 0 || ( 1 && 0 ) ) || (  2 && 3 && 0  ) ) || ( 1 && 0 )

将二者明白成不辨别优先级,从左到右实行

0 || ( 1 && ( 0 || ( 2 && ( 3 && ( 0 || ( 1 && 0 ) ) ) ) ) )

所以,理论上是 && 优先级更高,然则,使用时可以用等价体式格局。

    原文作者:siwuxie
    原文地址: https://segmentfault.com/a/1190000015919187
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞