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

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

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

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

Q&A

解決済

2回答

327閲覧

「Object.keys」の構文について

take-t.t.

総合スコア360

JavaScript

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

1グッド

0クリップ

投稿2019/05/10 16:51

編集2019/06/06 18:34

以下のコードにおいて自分では理解できない点があります。

JavaScript

1const obj = { 2 a: 1, 3 b: 2, 4 c: 3, 5}; 6 7Object.keys(obj).forEach((key) => { 8 console.log(`${key} : ${obj[key]}`); // 「a : 1, b : 2, c : 3」と出力される。 9}) 10 11Object.keys(obj).forEach((key) => { 12 console.log(`${key} : ${obj.key}`); // 「a : undefined, b : undefined, c : undefined」と出力される。 13}) 14 15//対して 16 17console.log(obj['a']); //「1」と出力される。 18 19console.log(obj.a); //「1」と出力される。 20

私の頭の中では、

Object.keys(obj)によって、objオブジェクトから[a, b, c]の配列を取得


forEachの引数「key」が各キー(a, b, c)に割り当てられ、それぞれ代入していき、

「obj.a, obj.b, obj.c」となり、「1, 2, 3」が出力される、

と思っていたのですが、結果は「undefined」になってしまいました。
しかし「console.log」で両記法で出力してみた結果、同じ値が帰ってきます。
これは何が違うのでしょう?

独学でJavaScriptを始めたのですが、一々思っていたものと違う動作をしてきて頭がイカれそうです。
どなたかご教授よろしくお願いいたします。 m( _ _ )m

sasasa1231👍を押しています

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

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

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

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

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

guest

回答2

0

2つ目のforEachループでは
obj.key となっていますが、これは
obj[key] ではなく obj['key'] と同じです。

ループ内で、 'a', 'b', 'c' ではなく、
毎回 'key' という要素を取得するコードになってしまっています。

JavaScript

1console.log(obj['key']); // undefined 2console.log(obj.key); // undefined

投稿2019/05/10 17:20

Eggpan

総合スコア2665

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

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

take-t.t.

2019/05/10 18:10

ご回答ありがとうございます。 自分は勝手に「obj.key = obj[key]」だと思っていたのですが、言われてみればその通りです... [key]とすることで、keyの値が変化できるということですね。 勉強になりました、ありがとうございました。
guest

0

ベストアンサー

obj.key の key は変数ではないですよ。key という名前のプロパティを探しても見つからず、undefined が返っています。

投稿2019/05/10 16:58

iwamot

総合スコア1154

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

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

take-t.t.

2019/05/10 17:26 編集

ご回答ありがとうございます。 私の理解では変数というよりは、 ``` const obj = { a: 1, b: 2, c: 3, }; Object.keys(obj).forEach((key) => { console.log(key); //「a, b, c」が出力される。 }) ``` 上の要領で、「obj.key」のkeyの部分に「a, b, c」が割り当てられるものと思っていたのですが、違うということでしょうか。 あともしよろしければ、「obj[key]」の場合はなぜ「1, 2, 3」が出力されるのか、ざっくりとで良いので理由を教えていただけないでしょうか。
iwamot

2019/05/10 17:38

keyは変数で、"a", "b", "c"が順に割り当てられます。一方、obj.key は単なる obj.key です。obj.a は 1、obj.b は 2、obj.c は 3と定義されていますが、obj.key は未定義です。 obj[key] の key は変数なので、"a"が割り当てられていたら obj["a"] となり、1が出力されます。
take-t.t.

2019/05/10 18:05

ご返信ありがとうございます、完全に理解できました。 お恥ずかしながら、引数に指定した文字列と同じものは必ず値が代入されるものと思っていました。 学習を進める前に、こうした基礎の部分をもう一度学び直したいと思います。 ご回答ありがとうございました。
iwamot

2019/05/11 03:08

よかったです。むしろこういう疑問を持ってあれこれ手を動かす方のほうが、プログラミングの適性がある気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問