【问题标题】:boolean evaluation of Object optional property that can be NaN?可以是 NaN 的 Object 可选属性的布尔评估?
【发布时间】:2018-06-13 11:56:17
【问题描述】:

以下是JS中正常的属性检查:

if (x.prop && Array.isArray(x.prop) ) ...

快捷方式的计算结果为 x.prop === undefined,而表达式的计算结果为 false。但是:

var o = {a: NaN};
if (o.a && isNaN(o.a)) ... 

导致(NaN && true) -> (NaN) -> (false) 的强制,因此具有属性'a' 并且它是NaN 的条件永远不会被评估为真。

似乎我无法像检查大多数其他属性一样检查支持 NaN 的属性。我一直在“做错事”,还是应该一直使用o.hasOwnProperty()?还是typeof (o.prop) === 'undefined'?或者这只是一个 JS 怪癖,两个条件都有效但不能组合,因为它是 JS。

什么是“最佳实践”? (为什么?)最好,我会优先考虑正确性、可读性和速度(按此顺序)。

【问题讨论】:

  • 您可以使用("a" in o)查看是否有一个名为“a”的属性,其值为any(包括undefined)。
  • 哦,这对我来说是个新闻!谢谢!
  • 你为什么不直接使用if (Array.isArray(x.prop))

标签: javascript object nan


【解决方案1】:

当编译器评估o.a 时,它会补充o.a 的值,即NaN,这是一个虚假值。由于这个假值没有布尔比较,编译器评估它并返回一个假。

为了避免这种情况发生,您可以使用typeof 确保它不是undefined。我会先做这个检查以确保它存在,然后评估它是否是NaN

var o = { a: NaN };

//outputs a is NaN
if (typeof o.a !== "undefined") {
    if (isNaN(o.a)) {
        console.log("a is NaN");
    }
}

【讨论】:

    【解决方案2】:

    您可以省略对属性的检查,先检查对象本身,然后再检查属性。

    var o;
    console.log(o && isNaN(o.a));
    
    o = {};
    console.log(o && isNaN(o.a));
    
    o = { a: NaN };
    console.log(o && isNaN(o.a));

    【讨论】:

    • 我看到的其中一个问题是,尽管a 不存在,但中间情况将返回true。如果您评估此表达式并期望 a 存在以便您可以对其执行操作,这可能会导致问题。
    • @MarcusParsons,这取决于用例。 op 没有说明,究竟要测试什么。
    • 我和许多其他人一样,不会测试isNaN,除非我预计a 是现有属性。
    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2013-10-23
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2014-05-28
    相关资源
    最近更新 更多