JavaScript对象的空值检查 - 一个奇怪的JavaScript问题

3
想象这样一个简单的场景。我有一个变量,它可以是一个带有一个属性ID的普通JS对象,该属性是一个数字,或者obj变量可以为null。我有一个简单的test()函数,它检查变量是否不为null,并且必须具有有效的id属性。
var obj = { id: 111 };
function test() {
    return (obj && obj.id);
}

我希望这个函数始终返回布尔值,但实际上如果obj为undefined或者obj.id的值存在时,它会返回undefined,就像上面的例子一样,它返回了111而不是true。请问为什么会这样呢?

我要抓狂了……求解惑啊!


1
这段代码的意思是“如果 obj 存在,则返回 obj.id”。你也可以写成 obj && obj.id !== null - Toby
你想要的是添加“!!”,这将强制将其转换为布尔类型。 return !!(obj && obj.id) - Oram
@Oram 欢迎来到JavaScript的世界 :D - Yeldar Kurmangaliyev
2个回答

4
这是一个常见的误解。在JS中(不像PHP),像 x && y 的表达式会执行以下操作:
  1. 执行表达式 x
  2. 如果表达式 x 返回 true,那么也会执行表达式 y 并返回它 (y)。否则返回 x(此情况下为 falsy,例如 0''falsenullundefined)。
换句话说,它更像一个三元表达式 x ? y : z
如果你想要一个布尔值,那么使用 !!(x && y)

@YeldarKurmangaliyev 真的吗?)我添加了三元表达式作为示例,以证明二进制表达式x && y与三元表达式一样是条件逻辑表达式。 z是三元逻辑表达式的另一种情况。 - Nurbol Alpysbayev
1
我认为@YeldarKurmangaliyev提出了一个简单(而且好)的问题。也许更合适的例子是x ? y : x,因为如果x为假值,&&运算符将返回x - Tyler Roper
@NurbolAlpysbayev,我认为你的回答是一个很好的解释,Yeldar也这么认为。你的“真的吗?”让人觉得你对我认为的一个简单的好讨论问题有些反感,所以我进行了一些澄清。 - Tyler Roper
1
@TylerRoper "Seriously"只是在我看到他的评分和令人印象深刻的JS经验后的反应。顺便说一下,他也是我在这里看到的第一个来自我的国家的人。 - Nurbol Alpysbayev
1
@NurbolAlpysbayev 明白了 :) 只是沟通上的小问题! - Tyler Roper
显示剩余2条评论

0

当定义了obj时,为什么if (obj && obj.id)返回111

逻辑 AND (&&) 运算符如果可以转换为false,则返回expr1; 否则返回expr2

MDN: 逻辑运算符 - 描述(略有改动)

expr1 (obj) 无法转换为false,因此返回expr2 (111)。


为什么它没有返回true

逻辑运算符通常与布尔(逻辑)值一起使用。当它们与布尔值一起使用时,它们会返回一个布尔值。然而,&&||实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,则可能返回非布尔值。

MDN: 逻辑运算符

因为您正在使用逻辑运算符与非布尔值一起使用,结果也将是非布尔值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接