JavaScriptの配列で、var arr = []
で初期化した配列を用意し、arr[1]="!"
、arr[3]="!"
、arr[4]="!"
で代入しました。
そのあとarr.length で配列の数を確認したところ、3ではなく5が返ってきました。
これは、使っていない0,2も自動的にnull的なものが代入されているという事でしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
Array(配列)の仕様です。
Arrayのオブジェクトは0以上の整数値(正確には配列のインデックスと見なせればよく、"1"といった文字列でも可)のプロパティに対して代入した場合、length
プロパティがそのインデックス値よりも小さいときは、指定のインデックスより1だけ大きい数にlength
プロパティを設定するという仕様になっています。
9.4.2.1 DefineOwnProperty - Array Exotic Objects
この動作はオブジェクトとしては特殊であるため、Arrayはエキゾティックオブジェクト(Objectとは一部異なる動作を行う特殊なオブジェクト)の一つです。length
はインデックスとして扱えるプロパティの個数を表すものではなく、Arrayのオブジェクトが変更されたときに、それに併せて設定されている特殊なプロパティと言えます。他のpop()
等のメソッドやlength
自体に代入した場合も、length
の値を変えたり、length
に併せてはみ出し部分を削除したりすることで、通常の使い方の場合は、配列の長さのように扱えるようになっています。ただし、delete
のようにlength
を全く考慮しない処理もあります。
JavaScriptを解説した古い(または質が良くない)文章などでは「length
プロパティはインデックスとして扱えるプロパティのうち一番大きいインデックス値から1だけ大きい数」という説明がされている場合がありますが、この表現は正確ではありません。length
を考慮した処理(Arrayに関する通常の使い方であれば、ほとんど含まれる)を行った場合は、その説明に当て嵌まるようにlength
を常に調整しているだけに過ぎません。
では、欠けている部分がどうなっているかというと、本当に歯が欠けた状態です。Arrayのインデックスというのはただのプロパティであり、つまりは、0
や2
のプロパティが存在しないArrayであるということにすぎません。ただし、JavaScriptでは、存在しないプロパティへアクセスした場合はundefined
を返すため、arr[0]
とした場合はundefined
が返ってきますので、エラーにはなりません。ですが、arr[0] = undefined;
等を明確に設定した場合とこの歯欠けのarr
は厳密には異なる状態になります。
なお、上記についてはES2015以降しか私は調べていませんので、ES5以前では上記と異なる場合があります。ES5以前については誰かが補足してくれると思います。
投稿2017/11/25 14:15
総合スコア21735
0
length と数値プロパティとの関係に少し書いてありますが、lengthプロパティが変わるだけです。
javascript
1Object.keys(arr)
javascript
1arr.forEach(function(val, index){ 2 console.log(val, index); 3});
0や2は追加されない事を確認できます。
なお、arr[0]やarr[2]にアクセスした場合はundefinedが返却されます。
投稿2017/11/25 14:09
編集2017/11/25 14:12退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/02 16:30