_.indexOf()`item!== item` - 它的目的是什么?

时间:2015-03-10 14:38:06

标签: javascript underscore.js indexof

查看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是一个参数,并且在函数内部没有更改。变量何时会与自身不同?

我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

IEEE-754 NaNs不等于他们自己。 if语句正在检查item是否为NaN。如果是,则该函数需要使用特殊逻辑,因为array[i] === item的搜索循环测试将不起作用。

有关进一步的讨论,请参阅Why is NaN not equal to NaN?What is the rationale for all comparisons returning false for IEEE754 NaN values?

答案 1 :(得分:2)

数字常量NaN永远不会===到另一个值,包括它自己。因此,这是一种在没有函数调用的情况下测试NaN的方法。绝对任何其他item的值都会测试等于它自己:

  • undefined ===undefined
  • null ===null
  • 数字等于它自己,字符串或布尔值
  • 对象的引用为===自身(自身!)