forEachって配列の中の要素がundefinedだと華麗にスルーしやがるんだな。知らなくてハマったぜ。
こんな感じ。みなさまも気をつけてくださいね。
言ってることは正しいが,「配列の要素がundefined」は微妙に正しくない.そのサンプルで, arr[1] = undefined; と明示的にundefinedを代入するとforEachでもundefinedが現れる.だから「要素がundefinedだととばす」というよりは「存在しない要素をとばす」のほうがより正確な言い方.
var arr = new Array(1);console.log(arr[0]) //undefined
最初の段階からundefinedなんだが。明示的に宣言されるundefinedと明示的に宣言されたundefinedではどう言語仕様的に異なるのだろうか。謎だ。ちなみに「存在しない要素」というのはJavaScriptの言語的にはなんて表現になるのよ?それを表す言葉がJavaScriptに果たして存在しているのだろうか?
単純にバグなのかな?for文でループかけるとundefinedのものもスキップしないで見てくれるんだけど。あ、トピ主ね。
最初からundefinedになるのは,「存在しないプロパティを読むとundefinedが返る」というJavaScriptの仕様.バグではない.たとえば,var obj = {foo: 3};console.log(obj.bar);とするとundefinedが表示される.つまり,「そもそもプロパティが存在しない」場合と「プロパティが存在して,中身はundefined」である場合の違い.new Arrayで配列を作ったときは,「全部undefinedが入っている」のではなく「全く何も入っていない」状態になっている.forEachを使った場合とfor文の場合で挙動が違うのは,for文でforEachの挙動を再現したつもりでも,実は再現できていないから.(forEachの正確な挙動は仕様書を参照のこと.)つまり,そのfor文がやっていることは「iを0からmax-1まで順に動かし,arr[i]を表示する」ということ.プロパティが存在しているかとか,中身がundefinedか否かなんてのは一切考慮しないプログラムになっている.一方,forEachはプロパティが存在しているか否かを区別してくれる.その違いが現れているのであって,バグではない.ちなみに,「そもそもプロパティが存在しない」場合と「プロパティが存在しているけど中身がundefined」場合を区別する方法は,in演算子を使うこと.詳しくはググっていただきたい.
in演算子で確認してみました。なるほど。理解が深まりました!ありがとうございます!(トピ主)
みんなの回答 2 件
こんな感じ。みなさまも気をつけてくださいね。
Imgur: The most awesome images on the Internet
http://imgur.com/1eo19bU言ってることは正しいが,「配列の要素がundefined」は微妙に正しくない.
そのサンプルで, arr[1] = undefined; と明示的にundefinedを代入するとforEachでもundefinedが現れる.
だから「要素がundefinedだととばす」というよりは「存在しない要素をとばす」のほうがより正確な言い方.
関連するトピックス