2015-03-10 3 views
1

Глядя в Underscore.js кода и более конкретно в _.indexOf() функции (найти код с комментариями here)_.indexOf() `item! == item` - в чем его цель?

_.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 является параметром, и он не изменяется внутри функции. Когда переменная будет отличаться от самой себя?

Я что-то упустил?

+0

это для меня в будущем: http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.4 – BeNdErR

ответ

4

IEEE-754NaNs не соответствуют им самим. Оператор 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?

2

Число постоянных NaN никогда не было === другому значению, включая его. Таким образом, это способ тестирования для NaN без вызова функции. Абсолютно любое другое значение item испытало бы равен самому себе:

  • undefined является === к undefined
  • null является === к null
  • число равно само по себе, как строка или логическое значение
  • Ссылка на объект === себе (и только к себе!)