对象可选属性的布尔评估,可以是NaN吗?

问题描述 投票:0回答:2

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

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

快捷方式评估结果为x.prop === undefined,表达式的结果为false。但:

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

导致qazxsw poi - > qazxsw poi - > qazxsw poi的强制,因此具有(NaN && true)属性并且它是(NaN)的条件从未被评估为真。

似乎我无法像大多数其他属性一样检查NaN-able属性。我一直“做错了”,还是应该一直使用(false)?还是'a'?或者这只是一个JS怪癖,其中两个条件都有效但不能合并,因为它是JS。

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

javascript object nan
2个回答
0
投票

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

NaN

0
投票

当编译器评估o.hasOwnProperty()时,它补充typeof (o.prop) === 'undefined'的值为var o; console.log(o && isNaN(o.a)); o = {}; console.log(o && isNaN(o.a)); o = { a: NaN }; console.log(o && isNaN(o.a));,这是一个假值。由于此falsey值没有布尔比较,因此编译器会对其进行求值并返回false。

为了减轻这种情况的发生,你可以使用o.a来确保它不是o.a。我会首先检查它以确保它存在,然后评估它以查看它是否是NaN

typeof
© www.soinside.com 2019 - 2024. All rights reserved.