-
ID:smiJAx さんの質問

forEachって配列の中の要素がundefinedだと華麗にスルーしやがるんだな。
知らなくてハマったぜ。

みんなの回答 2 件

ID:smiJAx さんの回答

こんな感じ。みなさまも気をつけてくださいね。

Imgur: The most awesome images on the Internet

http://imgur.com/1eo19bU
ID:0tix4/ さんの回答

言ってることは正しいが,「配列の要素がundefined」は微妙に正しくない.
そのサンプルで, arr[1] = undefined; と明示的にundefinedを代入するとforEachでもundefinedが現れる.
だから「要素がundefinedだととばす」というよりは「存在しない要素をとばす」のほうがより正確な言い方.

ID:A6yJ9a

var arr = new Array(1);
console.log(arr[0]) //undefined

最初の段階からundefinedなんだが。明示的に宣言されるundefinedと明示的に宣言されたundefinedではどう言語仕様的に異なるのだろうか。謎だ。ちなみに「存在しない要素」というのはJavaScriptの言語的にはなんて表現になるのよ?それを表す言葉がJavaScriptに果たして存在しているのだろうか?

ID:A6yJ9a

単純にバグなのかな?for文でループかけるとundefinedのものもスキップしないで見てくれるんだけど。あ、トピ主ね。

ID:0tix4/

最初から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演算子を使うこと.詳しくはググっていただきたい.

ID:A6yJ9a

in演算子で確認してみました。なるほど。理解が深まりました!
ありがとうございます!(トピ主)

最終更新日:2016-06-13 (3,763 views)

関連するトピックス

ページ上部に戻る