r
等于什么?为什么?
换句话说,布尔运算符如何处理对象?
var data = {x:123, y:456};
var r = data && data.x || 0;
更新
当我运行时r
总是等于x
,但我不明白为什么。
答案 0 :(得分:3)
让我们看一下作业,记住JavaScript Operator Precedence
var r = data && data.x || 0
在&&
之前操作||
,&&
如果强制转换为true
则返回最后一个操作数,否则返回false
。所以,它将被简化为:
var r = data.x || 0
现在||
运算符返回第一个返回true的操作数,并且data.x
强制转换为true
,它将返回data.x
:
var r = data.x
关于Javascript对象本身,即使对象为空,它们也将始终返回true
。即obj = {}
另一方面,如果验证对象的属性,则情况不同:如果属性具有布尔值false
或数值0
,则验证将解释这两者值为false
,0 == false
但0 !== false
。
实际上,我们假设:
var data = { x:false, y:456 };
var r = data && data.x || 999;
r
等于999
,如果data.x
设置为0,则为真。
答案 1 :(得分:2)
来自MDN,
Javascript在布尔上下文中使用类型强制。
Javascript中有8个“虚假”值
在您的示例中,data && data.x || 0
,&&和||使这成为布尔上下文。 data
被强制为布尔值。如果它不是上面列出的值之一,则强制为真。
程序员通常通过检查值是否为“falsy”来检查是否定义了一个对象(即非空且未定义)。您的示例可以重写为
var r = 0;
if(data && data.x){
r = data.x;
}
我认为这清楚表明您正在检查是否定义data
并且data.x
不是假的(例如0)。如果您不确定变量是否包含有效对象,这是一种避免空引用错误的常用技术。