在Array.prototype.includes()
的{{3}} polyfill函数中,我找到了以下代码。
function sameValueZero(x, y) {
return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
}
在上面的代码中
typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)
这让我感到困惑。如果typeof
变量是一个数字,isNaN
总是假的吗?那么这整个情况何时会恢复正常?有人可以解释或我是否理解错了?
答案 0 :(得分:1)
在JavaScript中,NaN
的类型为number
。我想这是因为它是数学运算的结果。
有关详细信息,请参阅this question。
答案 1 :(得分:0)
如果2个元素为true
,则此代码将返回NaN
,如果两个元素都不是数字,则返回false
。
如您所见,第一个示例返回true
同时为isNaN()
,无论其类型如何 - 这使得a
等于b
。在使用isNaN()
之前,第二个检查两者是否为数字:
const checkEq1 = (x, y) => isNaN(x) && isNaN(y)
console.log(checkEq1(NaN, NaN)); // true
console.log(checkEq1('a', 'b')); // true - error
const checkEq2 = (x, y) => typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)
console.log(checkEq2(NaN, NaN)); // true
console.log(checkEq2('a', 'b')); // false