JS对象空检查-奇怪的JS问题

时间:2018-12-03 15:50:18

标签: javascript typechecking null-check

想象一下这个简单的场景。我有一个变量,它可以是具有一个属性ID的普通JS对象,即一个数字或obj变量可以为null。我有一个简单的test()函数,该函数检查变量是否不为null且必须具有有效的id属性。

var obj = { id: 111 };
function test() {
    return (obj && obj.id);
}

我期望此函数将始终返回布尔值,但实际上,如果obj未定义,则返回undefined;如果对象存在(如上述情况),则返回obj.id的值。为什么此函数返回111而不是true。

我要扯掉我的头发...请阐明我的想法:)

2 个答案:

答案 0 :(得分:4)

这是一个常见的误解。在JS中(不同于PHP),像x && y这样的表达式可以做到这一点:

  1. 执行表达式x
  2. 如果表达式x返回true,则也执行表达式y 并将其返回(y。否则,返回x(在这种情况下会很虚假,例如0''falsenullundefined)。

换句话说,它的工作方式更像是三元表达式x ? y : z

如果要布尔值,请使用!!(x && y)

答案 1 :(得分:0)

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

  

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

MDN: Logical Operators - Description(略作释义)

expr1obj)不能转换为false,因此它返回expr2111)。


为什么它不返回true

  

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

MDN: Logical Operators

由于您将逻辑运算符与非布尔值一起使用,因此结果也将为非布尔值。