質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

213閲覧

JavaScript 配列と初期化について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/11/25 13:25

JavaScriptの配列で、var arr = []で初期化した配列を用意し、arr[1]="!"arr[3]="!"arr[4]="!"で代入しました。
そのあとarr.length で配列の数を確認したところ、3ではなく5が返ってきました。
これは、使っていない0,2も自動的にnull的なものが代入されているという事でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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のインデックスというのはただのプロパティであり、つまりは、02のプロパティが存在しないArrayであるということにすぎません。ただし、JavaScriptでは、存在しないプロパティへアクセスした場合はundefinedを返すため、arr[0]とした場合はundefinedが返ってきますので、エラーにはなりません。ですが、arr[0] = undefined;等を明確に設定した場合とこの歯欠けのarrは厳密には異なる状態になります。

なお、上記についてはES2015以降しか私は調べていませんので、ES5以前では上記と異なる場合があります。ES5以前については誰かが補足してくれると思います。

投稿2017/11/25 14:15

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/02 16:30

詳しく説明ありがとうございました。 何度も読み返してみます。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/02 16:31

説明ありがとうございます。 もう少し勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問