JS 逻辑与为何能返回其运算值而非布尔值

当笔者刚进入 JS 的世界的时候,一直为它的灵活写法感到着迷,同时也有一些疑惑

希望当对象存在时,得到其属性,可以这么写 parent && parent.child,为什么这个返回的不是一个布尔值,正如 C 语言所表现的。

笔者翻阅 ES 5,得到ES5/表达式/二元逻辑运算符找到如下答案。

二元逻辑运算符

LogicalANDExpression :
   BitwiseORExpression
   LogicalANDExpression && BitwiseORExpression


语义:

产生式 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression 按照下面的过程执行:

令 lref 为解释执行 LogicalANDExpression 的结果。
令 lval 为 GetValue(lref)。
如果 ToBoolean(lval) 为 false,返回 lval。
令 rref 为解释执行 BitwiseORExpression 的结果。
返回 GetValue(rref)。

如果左表达式执行后不能转化为 false,那么返回右表达式的value,其中转化过程 ToBoolean 规则如下

代入 parent && parent.child 可以知道当 parent 是一个对象时,ToBoolean 能使它转化为 true,则返回 parent.child 的值。

上图中 GetValue 的转化过程比较复杂,简述就是返回其 [[Get]] 或者 [[Value]] 的值。

posted @ 2020-03-15 16:22  Ever-Lose  阅读(350)  评论(0编辑  收藏  举报