2011-02-02 2 views
2

В this page вы можете увидеть следующий пример того, как реализовать IndexOf для массивов:if (obj! == obj) делает что-то?

if (!Array.prototype.indexOf) 
{ 
    Array.prototype.indexOf = function(searchElement /*, fromIndex */) 
    { 
    "use strict"; 

    if (this === void 0 || this === null) 
     throw new TypeError(); 

    var t = Object(this); 
    var len = t.length >>> 0; 
    if (len === 0) 
     return -1; 

    var n = 0; 
    if (arguments.length > 0) 
    { 
     n = Number(arguments[1]); 
     if (n !== n) // <-- code of interest 
     n = 0; 
     else if (n !== 0 && n !== (1/0) && n !== -(1/0)) 
     n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
    } 

    if (n >= len) 
     return -1; 

    var k = n >= 0 
      ? n 
      : Math.max(len - Math.abs(n), 0); 

    for (; k < len; k++) 
    { 
     if (k in t && t[k] === searchElement) 
     return k; 
    } 
    return -1; 
    }; 
} 

Моего вопроса о линии:

if (n !== n) 

в этом случае будет это логическое возвращение выражения true?

+0

В случае 'n' не точно такое же значение и тип как' n' :) – orlp

ответ

4

Это ярлык для проверки того, является ли число NaN.
скажите, если у вас есть n = Number("string");, тогда n !== n будет оценивать true.
В этом случае вы могли бы использовать if(isNaN(n)) вместо if(n !== n).

2

Точно так же вы проверяете NaN. Вероятно, они делают это как предосторожность, потому что можно написать глобальную функцию isNaN.

+0

В Math (или самой Math!) Можно перезаписать все, но они ничего не делают с этим. Я думаю, было бы глупо пытаться рассмотреть случай, когда кто-то перезаписал глобальную функцию. –

+0

@ Matti - Можете ли вы объяснить, почему кто-нибудь написал такое запутанное выражение? – ChaosPandion

+0

Возможно, по той же причине они написали '>>> 0' и еще что-то. –

0

// большую часть времени вам не нужно пытаться имитировать спецификации так exactly-

if(!Array.prototype.indexOf){ 
    Array.prototype.indexOf= function(what, i){ 
     if(i==undefined || isNaN(i)) i= 0; 
     var L= this.length; 
     while(i< L){ 
      if(this[i]=== what) return i; 
      ++i; 
     } 
     return -1; 
    } 
} 
Смежные вопросы