查看ECMA规范,我们可以看到关于&& 和 || 如何运算的定义。如下:
lref && rref
1.Let lref be the result of evaluating LogicalANDExpression.
2.Let lval be GetValue(lref).
3.If ToBoolean(lval) is false, return lval.
4.Let rref be the result of evaluating BitwiseORExpression.
5.Return GetValue(rref).
lref || rref
1.Let lref be the result of evaluating LogicalORExpression.
2.Let lval be GetValue(lref).
3.If ToBoolean(lval) is true, return lval.
4.Let rref be the result of evaluating LogicalANDExpression.
5.Return GetValue(rref).
两个我们需要关注的信息
1、&&,||运算符是短路的,在判断lref为false/true的情况,直接return了。
2、返回值不是boolean类型,而是返回lref或者rref之一。
所以我们可以写出很多这样的表达式:
var Yahoo=Yahoo||{} //用于定义类
var result= "ab"||"cd" //用于赋值操作,减少if,else的判断
var result= true && "test" //用于赋值操作,减少if,else的判断
这里需要注意,在转换lref的值为boolean的时候,有一些特殊数据的转换有如下规则:
+0、-0、""、null、false、undefined、NaN 均会被判断为 false。其余情况均为true。
根据以上规则,我们可以写出很多简洁的代码。但是请注意可阅读性和简洁性的平衡。