_.indexOf() `item !== item` - 它的目的是什么?
_.indexOf() `item !== item` - what is its purpose?
查看 Underscore.js
代码,更具体地说,查看 _.indexOf()
函数(查找带有注释的代码 here)
_.indexOf = function(array, item, isSorted) {
var i = 0, length = array && array.length;
if (typeof isSorted == 'number') {
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
} else if (isSorted && length) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (item !== item) {
return _.findIndex(slice.call(array, i), _.isNaN);
}
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
我注意到 if(item !== item){...}
语句,但我不明白它的用途。 items
是一个参数,它在函数内部没有改变。什么时候变量会与自身不同?
我是不是漏掉了什么?
数字常数 NaN
永远不会 ===
到另一个值,包括它自己。因此,这是一种无需函数调用即可测试 NaN
的方法。 item
的任何其他值绝对会测试等于其自身:
undefined
是 ===
到 undefined
null
是 ===
到 null
- 数字等于其自身,字符串或布尔值也是如此
- 对对象的引用是
===
对自身的引用(并且 仅 对自身!)
IEEE-754 NaNs 不等于它们自己。 if
语句正在检查 item
是否为 NaN。如果是,该函数需要使用特殊逻辑,因为 array[i] === item
的搜索循环测试将不起作用。
有关进一步讨论,请参阅 Why is NaN not equal to NaN? and What is the rationale for all comparisons returning false for IEEE754 NaN values?
查看 Underscore.js
代码,更具体地说,查看 _.indexOf()
函数(查找带有注释的代码 here)
_.indexOf = function(array, item, isSorted) {
var i = 0, length = array && array.length;
if (typeof isSorted == 'number') {
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
} else if (isSorted && length) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (item !== item) {
return _.findIndex(slice.call(array, i), _.isNaN);
}
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
我注意到 if(item !== item){...}
语句,但我不明白它的用途。 items
是一个参数,它在函数内部没有改变。什么时候变量会与自身不同?
我是不是漏掉了什么?
数字常数 NaN
永远不会 ===
到另一个值,包括它自己。因此,这是一种无需函数调用即可测试 NaN
的方法。 item
的任何其他值绝对会测试等于其自身:
undefined
是===
到undefined
null
是===
到null
- 数字等于其自身,字符串或布尔值也是如此
- 对对象的引用是
===
对自身的引用(并且 仅 对自身!)
IEEE-754 NaNs 不等于它们自己。 if
语句正在检查 item
是否为 NaN。如果是,该函数需要使用特殊逻辑,因为 array[i] === item
的搜索循环测试将不起作用。
有关进一步讨论,请参阅 Why is NaN not equal to NaN? and What is the rationale for all comparisons returning false for IEEE754 NaN values?