以下是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。
什么是“最佳实践”? (为什么?)最好的,我会优先考虑正确性,可读性和速度(按此顺序)。
您可以省略对属性的检查并检查对象本身,然后检查属性。
NaN
当编译器评估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