パスワードを忘れた? アカウント作成
283301 journal

kehiの日記: JavaScriptのlengthってこんな仕様だったのか(汗 4

日記 by kehi

よくぞまーこれまで気がつかずに無事ですんだものだ。。(汗

都道府県名を配列に入れて

for(i=0;i<a.length;i++){}

とかやってHTML表示していたロジックで今まですんなり動いていたものに対し、とある事情で配列の添え字を1からスタートするように変更したときのこと・・・

47しかないはずの都道府県の数が48になっちゃうのでバグかと思い、いろいろなブラウザで試すも結果は一緒。
あれ??って思ってlengthの仕様を調べてみたら、背中に悪寒が(滝汗

http://builder.japan.zdnet.com/sp/javascript-kickstart-2007/story/0,3800083428,20366841-2,00.htm/

firebugコンソールに以下のコードを貼りつけると試せます。

var before=[];
before[0]='北海道';
before[1]='青森県';
before[2]='岩手県';
//・・・
alert('before='+before.length);//3
/**********/
var after=[];
after[1]='北海道';
after[2]='青森県';
after[3]='岩手県';
//・・・
alert('after='+after.length);//4
after[10000]='OTL';
alert('omake='+after.length);//10001

なぬ?!lengthは、「インデックス最大値 + 1」を表すってマジか?
after[1000]='***';
とか追加すると1001って返すのか。。。恐ろしい
よくぞ今まで無事だったな・・
てか今まで書いたコードの中に思わぬ落とし穴があったのかも・・(滝汗

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2010年12月18日 14時11分 (#1875953)

     というよりも、インデックスが0から始まるという仕様を理解していれば不思議に思うことはないのですが・・・
     100から作ってみたりすると面白いですよ。
    参考文献? [tohoho-web.com]

    • by Anonymous Coward
      そもそもJavaScriptにはawkと同様連想配列しかなくて、インデックスに見えるものも全部文字列に変換してから解決することに仕様上はなっていますしね。処理系は2^30-1以下のインデックスに限って最適化とかしていると思いますけど。
    • by Anonymous Coward
      他の言語やライブラリでも、lengthでインデックスの最大値が返る仕様の方が少数派だと思う。
      lengthがインデックスの最大値を返す仕様だとして、a = []のときlengthは何を返すんだよと。
    • by Anonymous Coward

      みんな微妙にずれたコメントをしているような気がする

      多分、元々の勘違いは配列のlengthは明示的に代入した個数を返すと思っていた事じゃないかな?

      つまり
      var after=[];
      after[1]='北海道';
      after[2]='青森県';
      after[3]='岩手県';
      とした場合はafter.lengthは3つしか代入していないのだから3になると勘違いしていた事だと思う。

      実際には、
      after[1]='北海道';
      とした段階でafter[0]=nullが暗黙的に行われ、結果、length=4になるんだけど。

typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...