適当な思いつきで書くブログ

UbuntuやPerlやJavaScriptやVimやZshやShellScriptやMySQLと戯れている中で適当な思いつきでやってみたことを書いています。

配列の各要素を参照するときにhoge["0"]ってアリなの?

配列のインデックスに用いられるのはnumberだけだと思ってたのですが…

試してみたら↓のようにhoge["0"]でもきちんと出力されたのです。

var hoge = ['foo', 'bar', 'baz'];

hoge[0];   //foo
hoge["0"]; //foo

インデックスはnumberじゃなくてもstringでもおkなのですか?

そもそもなんでこんなことしようとしたのかというと

だいぶ簡略化してますが↓みたいなのを書いていました。

var hoge = ['foo', 'bar', 'baz'];

var fuga = function(value) {
  var num = (function(){
    for (var i = 0; i < hoge.legnth; i++) {
      if (hoge[i] == value) return i;
    };
  })();

  if (typeof num == 'number') {
    alert("もう" + hoge[num] + "は" + (num + 1) + "番目にあるよ!!");
  } else {
    hoge.push(value);
    alert(value + "を追加したよ!!");
  };
};

fuga("foo"); // alert("もうfooは1番目にあるよ!!")

関数fuga()になにか値(value)を渡して配列hogeの中の各要素と照らし合わせて、

  • すでにあったらnumにその順番を、
  • なかったらnumは'undefined'なままで、

今度はnumのtypeofを見て

  • 'number'だったらすでにある旨をalertする、
  • 'number'じゃなかったら配列hogeに値を追加してその旨をalertする。


ただ、これを作ったときに間違えて、

  //if (typeof num == 'number') {
  if (num) {

ってしちゃってて、numが0のときfalseだったのでbugってたのです。

で、numがstringなら0も"0"だからtrueでおkなんだよなーって思ったので試してみた次第です。