JavaScriptのindexOf

JavaScriptのIndexOfといえば、こんな感じで文字列に対して指定するものだと思っていたのですが、

// 文字列
var str = "hello javascript";
console.log( str.indexOf("javascript") );
// => 6


他にもECMA-262のJavaScript拡張ではあるけど、配列に対しても使えたんですね。(追記:IE6-8は使えない)

var akimoto = ["AKB48", "SKE48", "NMB48"];
console.log( akimoto.indexOf( "SKE48" ) );
// 1


このイコール判定は===な厳密な比較で行われているので型を意識する必要があります。

var list = [1, "2", 3, "4", 5];
console.log( list.indexOf(5) );
// 4
var list = [1, "2", 3, "4", 5];
console.log( list.indexOf(4) );
// -1 !


と思ったら、Chromeのコンソールだと==で判定されているっぽいです。。うーん。。(Firebugとnodeのコンソールでは-1に)

  • Chromeのコンソール(これだけ3になっている)

  • Node

  • 追記

id:os0xさんにコメント頂いた通り、ブログ書きながら試していたのでこのページのprototype.jsが読み込まれて、上のような状態になっていたようです。

空のタブで実行した結果はちゃんと-1になりました。

prototype.js(1.4.0)のindexOfの実装。やっぱり==に。。。

// 447行目付近
  indexOf: function(object) {
    for (var i = 0; i < this.length; i++)
      if (this[i] == object) return i;
    return -1;
  },

prototype.jsコワイというかこの辺りは全く意識していなかったのでとても勉強になりました。ありがとうございます!

ちなみにObjectのプロパティにあるかどうかはhasOwnPropertyでこんな感じですかね。

Object.prototype.id = 1;
var obj = { name: "koba04", blog: "hatena" };
for ( o in obj ) {
    console.log("####" + o + "####");
    // inで判定
    if ( o in obj ) {
        console.log("property =>" + o + ":" + obj[o]);
    }
    // hasOwnPropertyで判定
    if ( obj.hasOwnProperty(o) ) { // if ( o in obj ) 
        console.log("has own property =>" + o + ":" + obj[o]);
    }
}

// ####name####
// property =>name:koba04
// has own property =>name:koba04
// ####blog####
// property =>blog:hatena
// has own property =>blog:hatena
// ####id####
// property =>id:1