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]] 的值。