質問するログイン新規登録
JavaScript

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

Q&A

2回答

696閲覧

jsのin演算子の仕様(?)を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

1グッド

1クリップ

投稿2020/02/23 04:24

編集2020/02/23 05:08

1

1

javascript勉強中の初心者です。
あまり気にしないのでいいのかもしれませんが、配列をin演算子で回した時の挙動がとても気になります。

js

1const obj = {1:1,2:2,3:3,4:4,5:5}; 2const _c = v => { console.log(v) }; 3 4for(let i in obj){ 5 _c(typeof(i)); //=>string*5 6 _c(obj[i]); //=>1,2,3,4,5 7}

当たり前ですが、objの中身を上記のコードで取れますよね。

疑問なのは次のような時で、以下のような時もobjの値がとれてしまいます。

js

1const obj = [1,2,3,4,5]; 2const _c = v => { console.log(v) }; 3 4for(let i in obj){ 5 _c(typeof(i)); //=>string*5 6 _c(obj[i]); //=>1,2,3,4,5 !?!?!?!??!?!?!? 7}

この場合istringなので
**iが1の場合はobj['1']となり、objは連想配列ではないので取れないはずでは?**と思うのですが・・・

暗黙の型変換が行われていると言う一言に尽きるのかもしれませんが、
一体どうなってるんでしょうか?

どなたかお教えてくださいm(_)m

追記です 14:00

hoshiさん、mさんご回答ありがとうございます。

ドキュメントはMDNの
Array
String
for
in
for...in
に目を通しています。

が、Arrayのページを見ると私の理解通り

配列は(連想配列のように)要素のインデックスに文字列を使うことはできず、整数を使う必要があります。

と書かれており、では何故、配列なのにstringでアクセスでてきるのか?と言うのが謎なのです。
in演算子の仕様?Stringの仕様?forの仕様?それともjavascript自体の仕様?
何なのかはよく分かりませんが、気になりすぎたので質問させていただきましたm(_)m

DaMik👍を押しています

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

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

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

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

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

m.ts10806

2020/02/23 04:45

ドキュメントはどこまで確認されたのでしょうか
hoshi-takanori

2020/02/23 07:43

気付いてしまいましたか…。JavaScript では、配列もオブジェクトなので、任意のプロパティを追加できます。が、やらないことを強くお勧めします。 https://stackoverflow.com/a/9952142/1019868
otn

2020/02/23 08:23

回答ではないですが、そのinは演算子じゃないです。for構文の一部です。
guest

回答2

0

iが1の場合はobj['1']となり、objは連想配列ではないので取れないはずでは?

いいえ、そんなことはありません。

js

1var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]; 2console.log(years.0); // 構文エラー 3console.log(years[0]); // 正しく動作

配列要素へのアクセスにも years[2] でなく years['2'] を使う事ができますが、必要になることはないでしょう。years[2] の 2 は最終的に、JavaScript エンジンが内部的に toString メソッドで型変換することで文字列にされます。
出典: Array - JavaScript | MDN #配列要素へのアクセス

こちらの記載を見るに、あなたのコードにおける obj['1'] が、 obj[1] と同じ結果を生み出すことも自明と思います。


余談ですが、 for...in - JavaScript | MDN は確認済みとのことですので認識されていると思いますが、配列の要素にアクセスするために for...in を使うのは推奨されません。 forEach 等を利用してください。

投稿2020/02/23 07:39

thyda.eiqau

総合スコア2982

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

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

thyda.eiqau

2020/02/23 07:43

初心者のうちに意識しすぎる必要はないですが、Objectは連想配列ではないこと、JavaScriptには「連想配列のように利用できるもの」はあっても連想配列そのものはないこと、を理解する必要があると思います。 あと、「配列は、リストのようなオブジェクトであ」るということも、読み飛ばさずに理解してください。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array#Description
guest

0

JavaScriptに「連想配列」と呼ばれるものはなく、{a: 1, b: 2}のようなものはobjectといいます。objectは基本的にはkeyとvalueのペアの集まりで、keyは必ずstringかsymbolです。例えば、{a: 1, 3: 2}なら「key="a", value=1」「key="3", value=2」という二つのペアから構成されています。そして、このペア一つ一つをpropertyといいます。(本当は、単なるkey-valueのペアだけでなく、key-getter-setterのペアであるpropertyもありますが、ここでは省略します。また、objectは「継承」によって、別のobjectのpropertyが自分のpropertyであるかのようにアクセスすることができますが、これも省略します。)

arrayもobjectの一種であることに変わりはありません。[2, 3, 1]という配列は「key="0", value=2」「key="1", value=3」「key="2", value=1」「key="length", value=3」という4つのペアを持ったobjectなのです(keyがnumber(数値)ではなくstringであることに注意してください)。

thyda.eiqauさんの回答の通り、arr[2]という風に要素にアクセスしても、この2は自動的にstringに変換されるので、arr['2']と書いても全く同じということになります。つまり、JavaScriptにおいては「arrayの要素」というのは**「arrayのpropertyの中で、keyが"非負の整数を表すstring"であるようなもの」**という意味です。

for...inはkeyがstringであるようなenumerable propertyにアクセスするので、arrayの場合は(少なくとも)すべての要素にアクセスすることになります(enumerable の説明も省略しますが、arrayの要素はデフォルトですべて enumerable です)。

Note: array は普通のobjectとは振る舞いが異なるので注意してください。つまり、{0: 1, 1: 2}[1, 2]は全く同じobjectではありません。前者はObject.prototypeを継承していますが、後者はArray.prototypeを継承しています。また、後者はlength propertyを持っています。その他にも違いはありますが、詳しくは触れません。arrayは特殊なobjectであり、プラスアルファの機能を持っていると思ってください。

投稿2020/02/24 10:52

karamarimo

総合スコア2555

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問