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)的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的类型转换

《你不知道的JavaScript》整理——强制类型转换

javascript中的数据类型转换

JavaScript if语句的限制

[2016-02-08][javascript][数据类型的隐式转换]

JavaScript —— 常用数据类型隐式转换