想象一下这个简单的场景。我有一个变量,它可以是具有一个属性ID的普通JS对象,即一个数字或obj变量可以为null。我有一个简单的test()函数,该函数检查变量是否不为null且必须具有有效的id属性。
var obj = { id: 111 };
function test() {
return (obj && obj.id);
}
我期望此函数将始终返回布尔值,但实际上,如果obj未定义,则返回undefined;如果对象存在(如上述情况),则返回obj.id的值。为什么此函数返回111而不是true。
我要扯掉我的头发...请阐明我的想法:)
答案 0 :(得分:4)
这是一个常见的误解。在JS中(不同于PHP),像x && y
这样的表达式可以做到这一点:
x
x
返回true,则也执行表达式y
并将其返回(y
)。否则,返回x
(在这种情况下会很虚假,例如0
,''
,false
,null
,undefined
)。换句话说,它的工作方式更像是三元表达式x ? y : z
。
如果要布尔值,请使用!!(x && y)
。
答案 1 :(得分:0)
obj
时,为什么if (obj && obj.id)
返回111
?逻辑AND(
&&
)运算符如果可以转换为expr1
,则返回false
;否则,返回expr2
。
MDN: Logical Operators - Description(略作释义)
expr1
(obj
)不能转换为false,因此它返回expr2
(111
)。
true
?逻辑运算符通常与布尔(逻辑)值一起使用。当它们是时,它们返回一个布尔值。但是,
&&
和||
实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们可能会返回非布尔值。 / strong>
由于您将逻辑运算符与非布尔值一起使用,因此结果也将为非布尔值。