【问题标题】:JS object null checking - weird JS problem [duplicate]JS对象空检查 - 奇怪的JS问题[重复]
【发布时间】:2019-05-04 22:51:36
【问题描述】:

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

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

我希望这个函数总是返回布尔值,但实际上如果 obj 是未定义的,它会返回 undefined 或者如果对象存在则返回 obj.id 的值,就像上面的情况一样。为什么这个函数返回 111 而不是 true。

我要扯掉我的头发...请照亮我的思想:)

【问题讨论】:

  • 这段代码的意思是“如果 obj 存在,则返回 obj.id”。你可以做obj && obj.id !== null
  • 你想要的是添加 !! 这将强制它转换为布尔值。 return !!(obj && obj.id)
  • @Oram 欢迎来到 JavaScript 世界:D

标签: javascript typechecking null-check


【解决方案1】:

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

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

MDN: Logical Operators - Description(稍作解释)

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


为什么不返回true

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

MDN: Logical Operators

因为您使用的是非布尔值的逻辑运算符,所以结果也将是非布尔值。

【讨论】:

    【解决方案2】:

    这是一个常见的误解。在 JS 中(与 PHP 不同),x && y 之类的表达式会这样做:

    1. 执行表达式x
    2. 如果表达式 x 返回 true,则同样执行表达式 y并返回它 (y)。否则返回x(在这种情况下是虚假的,例如0''falsenullundefined)。

    换句话说,它更像是一个三元表达式x ? y : z

    如果你想要一个布尔值,那么使用!!(x && y)

    【讨论】:

    • 很好的解释,但是三元表达式中的z是什么?
    • @YeldarKurmangaliyev 认真的吗? ) 我添加了三元表达式作为示例,以证明二元表达式x && y 是一个条件逻辑表达式,就像三元表达式一样。 z 是三元逻辑表达式的另一种情况。
    • 我认为@YeldarKurmangaliyev 提出了一个简单(而且很好)的问题。也许更恰当的例子是x ? y : x,因为&& 运算符将返回x,如果它是假的。
    • @TylerRoper “认真”只是我看到他的评分和令人印象深刻的 JS 经验后的反应。顺便说一句,他也是我在这里见到的第一个人
    • @NurbolAlpysbayev 明白 :) 只是沟通中的一个小问题!
    猜你喜欢
    • 2017-05-17
    • 2016-05-12
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多