2011-02-02 4 views
2

this pageでは、配列のためのindexOfを実装する方法の次の例を見ることができます:if(obj!== obj)somethig?

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

exactly-仕様をシミュレートしようとする必要はありませんほとんどの時間:) – orlp

答えて

4

これは、番号がNaNかどうかを確認するためのショートカットです。
n = Number("string");がある場合は、n !== ntrueと評価されます。
この場合、if(n !== n)の代わりにif(isNaN(n))を使用できました。

2

これはNaNの確認方法です。グローバル関数isNaNを上書きすることができるため、おそらくこれを予防策として実行しています。

+0

数学(または数学そのもの!)のすべてを上書きすることは可能ですが、どちらについても何もしません。私は誰かがグローバルな機能を上書きしたケースを検討しようとするのはばかげていると思います。 –

+0

@マッティ - 誰がそのような混乱した表現を書くのかを説明できますか? – ChaosPandion

+0

おそらく同じ理由で、彼らは '>>> 0 'とそれ以外のものを書いていました。 –

0

//あなたは 'N'は、N ' `とまったく同じ値と型でない場合にはそう

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; 
    } 
}