JavaScript 类型转换:(true && 1) vs (true | | 1)
Posted
技术标签:
【中文标题】JavaScript 类型转换:(true && 1) vs (true | | 1)【英文标题】:JavaScript type conversion: (true && 1) vs (true | | 1) 【发布时间】:2012-01-23 12:00:00 【问题描述】:javascript 是非严格类型的语言,例如 Java。
我们知道,它根据上下文转换结果的值:
"2" + "3"
结果"23"
"2" * "3"
结果6
这个比较清楚,可以理解。
我只是尝试了以下表达式并感到困惑:
true && 1
结果1
true || 1
结果true
为什么第一个给出数字,第二个给出布尔值?
考虑到 JavaScript 转换规则,由于 boolean
表达式的上下文,我希望在这两种情况下都得到 boolean
值。
【问题讨论】:
【参考方案1】:检查Douglas Crockford's site,上面写着:
&& 运算符通常称为逻辑与。它也可以称为 警卫。如果第一个操作数为 false、null、未定义,“”(空 string) 或数字 0 则返回第一个操作数。否则, 它返回第二个操作数。这提供了一种方便的编写方式 空检查:
var value = p && p.name; /* The name value will only be retrieved from
p if p has a value, avoiding an error. */
||运营商通常是 称为逻辑或。它也可以称为默认值。如果第一个操作数 为 false、null、未定义、""(空字符串)或数字 0, 然后它返回第二个操作数。否则,它返回第一个 操作数。这提供了一种指定默认值的便捷方式:
value = v || 10; /* Use the value of v, but if v doesn't have a value,
use 10 instead. */
【讨论】:
感谢您的解释 - 关于守卫和默认值很有趣 不客气。总而言之,我建议阅读 Douglas 的 JavaScript 页面而不是规范。在我看来,这更容易理解。 javascript.crockford.com 很好的解释!我希望我能给你 +3。 @OldPro 非常感谢,但应归功于道格拉斯·克罗克福德的功劳。【参考方案2】:致quote MDC;
&&; 如果expr1可以转换为false则返回;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。
||;如果可以转换为 true,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,||如果任一操作数为真,则返回真;如果两者都是 false,则返回 false。
所以在第一个示例中,1
被返回,因为 expr1
无法转换为 false。
在第二个示例中,true
可以转换为 true,因此返回。
【讨论】:
非常感谢,其实你提醒我,Mozilla 资源作为 JavaScript 文档非常有价值【参考方案3】:这与类型转换无关。
||
返回第一个真值操作数。 1 || true
会给你1
&&
返回第一个假操作数,如果两者都为真,则返回第二个操作数。
见ECMAScript specification第58页
【讨论】:
【参考方案4】:true && 1
=> 如果所有条件都为真或假,这将始终返回 && 的最后一个值
true || 1
=> 这将始终返回第一个“真实”值
资源:
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf
【讨论】:
【参考方案5】:你也可以做其他事情,比如:
var myVar = Math.random() > 0.5;
myVar && doFunc();
与
相同if(myVar)
doFunc();
||
的基本意思是“如果第一件事是假的,那就去第二件事”
&&
的基本意思是“如果第一件事是真的,就去做第二件事”
这就是为什么你会在函数顶部看到这样的东西:
function myFunction(options)
options = options || ;
这意味着:如果选项是错误的,则将其设为
【讨论】:
【参考方案6】:您将强制转换(* / + 运算符将执行此操作)与逻辑评估(其中 &&,||)混淆。
【讨论】:
以上是关于JavaScript 类型转换:(true && 1) vs (true | | 1)的主要内容,如果未能解决你的问题,请参考以下文章