摘要:为什么比优先级高起因偶然在网上搜索运算符优先级,几乎每个版本都告诉读者比优先级更高,包括这样的权威网站也不例外。这与自己经验不符它们应该是优先级一样的。
为什么 && 比 || 优先级高?
起因偶然在网上搜索 js 运算符优先级,几乎每个版本都告诉读者 && 比 || 优先级更高,包括 MSN 这样的权威网站也不例外。
MDN Operator_Precedence
这与自己经验不符 —— 它们应该是优先级一样的。
论证0 || 1 && 0 || 2 // 按 && 优先级高 ( 0 || ( 1 && 0 ) ) || 2 // 按优先级一致 0 || ( 1 && ( 0 || 2 ) )
无论怎么执行结果都一样
诡辩因为有 MDN 背书,中英文版本都是一样,心想这事情不会那么简单。于是,打开 ES 规范来找寻真相。
12.13 Binary Logical Operators SyntaxLogicalANDExpression[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: EvaluationLogicalANDExpression : 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
摘要:前言为是可以实现的。在中,非对象参数将被视为一个冻结的普通对象,因此会返回。注意所以一定要是对象,如果是非对象的其他基本类型如,,被视为冻结对象,不能重写,则不起效果。第四步为这时已经为,运行返回值也为。最后为如上所示为,为,则为其他链接 前言 a==3 && a==4为True是可以实现的。具体代码如下所示: let a=[]; var x=3; a.valueOf=()=>{ ...
摘要:以下这个情况并非独有,任何采用二进制浮点数,依据都会如此这是因为用二进制浮点表示并不精确。是,不过更准确的定义应该是,,因为实际上它还是个。是声明变量的默认值。数字还有个特殊的数值数字和数字对象 原文 You Dont Know JS: Types & Grammar 类型 null undefined boolean number string object symbol -- a...
摘要:由两部分组成模板起始符,称为沉音符反引号,其内容被识别为字符串模板。其实这是通过属性操作中的结果,也就是说属性将对控制符进行转义从而实现按照普通字符输出。的语法是紧跟在后面,两者间不能有空格或制表符等。 1. Brief ES6(ECMAScript 6th edition)于2015年7月份发布,虽然各大浏览器仍未全面支持ES6,但我们可以在后端通过Node.js 0.12和io....
入坑 Python自从进入公司,到现在也有半年的时间。这半年的时间从 python 到入门到开发了几个小项目,类型涵盖了web应用 程序、爬虫程序 (scrapy),python脚本工具,自动化工具。对 python 语言也越来越熟悉,当然也有所感悟和总结。首先 Python 真的让语言成 了一个工具,入门代价很小,上手能够开发出小工具,可以更快体验到编程的乐趣。但是做到pythonic需要更多的...
阅读 1823·2021-11-23 09:51
阅读 938·2021-10-08 10:05
阅读 3428·2021-09-26 09:55
阅读 1033·2021-09-22 15:21
阅读 1628·2021-09-09 09:33
阅读 1249·2019-08-30 15:56
阅读 1278·2019-08-30 15:55
阅读 963·2019-08-30 13:19