资讯专栏INFORMATION COLUMN

ES2018 学习笔记(2)&& 和 || 的运算优先级

james / 2429人阅读

摘要:为什么比优先级高起因偶然在网上搜索运算符优先级,几乎每个版本都告诉读者比优先级更高,包括这样的权威网站也不例外。这与自己经验不符它们应该是优先级一样的。

为什么 && 比 || 优先级高?

起因

偶然在网上搜索 js 运算符优先级,几乎每个版本都告诉读者 &&|| 优先级更高,包括 MSN 这样的权威网站也不例外。

MDN Operator_Precedence

这与自己经验不符 —— 它们应该是优先级一样的。

论证
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 ) ) ) ) ) )

所以,理论上是 && 优先级更高,但是,使用时可以用等价方式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96677.html

相关文章

  • js双等号探索(二): a==3&&a==4 为true ?

    摘要:前言为是可以实现的。在中,非对象参数将被视为一个冻结的普通对象,因此会返回。注意所以一定要是对象,如果是非对象的其他基本类型如,,被视为冻结对象,不能重写,则不起效果。第四步为这时已经为,运行返回值也为。最后为如上所示为,为,则为其他链接 前言 a==3 && a==4为True是可以实现的。具体代码如下所示: let a=[]; var x=3; a.valueOf=()=>{ ...

    cheng10 评论0 收藏0
  • You-Dont-Know-JS / Types & Grammar 笔记

    摘要:以下这个情况并非独有,任何采用二进制浮点数,依据都会如此这是因为用二进制浮点表示并不精确。是,不过更准确的定义应该是,,因为实际上它还是个。是声明变量的默认值。数字还有个特殊的数值数字和数字对象 原文 You Dont Know JS: Types & Grammar 类型 null undefined boolean number string object symbol -- a...

    Drummor 评论0 收藏0
  • ES6 Features系列:Template Strings & Tagged Templ

    摘要:由两部分组成模板起始符,称为沉音符反引号,其内容被识别为字符串模板。其实这是通过属性操作中的结果,也就是说属性将对控制符进行转义从而实现按照普通字符输出。的语法是紧跟在后面,两者间不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份发布,虽然各大浏览器仍未全面支持ES6,但我们可以在后端通过Node.js 0.12和io....

    MyFaith 评论0 收藏0
  • Python学习笔记

    入坑 Python自从进入公司,到现在也有半年的时间。这半年的时间从 python 到入门到开发了几个小项目,类型涵盖了web应用 程序、爬虫程序 (scrapy),python脚本工具,自动化工具。对 python 语言也越来越熟悉,当然也有所感悟和总结。首先 Python 真的让语言成 了一个工具,入门代价很小,上手能够开发出小工具,可以更快体验到编程的乐趣。但是做到pythonic需要更多的...

    社区管理员 评论0 收藏0

发表评论

0条评论

james

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<