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

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

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

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

Q&A

解決済

2回答

789閲覧

高階関数,コールバック関数の流れの理解が正しいのか、なぜこのような出力結果になるのか知りたいです、、

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2021/05/08 14:07

目的

  • 処理の流れの理解は正しいのか確認したいです
  • f(data[key],key);のブラケット記法でなぜこのような結果になるのか理解したいです

処理の流れの確認

  1. 12行目で実引数としてxとコールバック関数callbackを高階関数highに渡す
  2. highの仮引数dataにxの配列が代入され、fにはcallbackが渡される
  3. for in文で、dataが仮引数keyに格納される
  4. callback関数に実引数として3行目のf(data[key], key);が渡される
  5. callback関数valueにはdata[key],keyにはkeyが渡される
  6. 8行目の文で実行する

が、自分が思っている処理の流れですがあっているでしょうか??

1 function high (data, f) { 2 for (let key in data) { 3 f(data[key], key); 4 } 5 } 6 7 function callback(value, key) { 8 console.log(key + ':' + value); 9 } 10 11 let x = [1, 2, 4, 8, 16]; 12 high(x,callback); 出力結果 0:1 1:2 2:4 3:8 4:16

f(data[key],key);のブラケット記法でなぜこのような結果になるのかがわからない

data[key]でアクセスしても、keyにはインデックス番号が入っているのに、なぜxのプロパティが出力されるのかがわかりません。

function high (data, f) { for (let key in data) { f(data, key); } }  結果 0:1,2,4,8,16 1:1,2,4,8,16 2:1,2,4,8,16 3:1,2,4,8,16 4:1,2,4,8,16

dataだけにすると値が全部入っている状態なのでそれを毎回繰り返して出力するだけで値を一つ一つ取り出す動作にならない

function high (data, f) { for (let key in data) { f(key[data], key); } } 結果 0:undefined 1:undefined 2:undefined 3:undefined 4:undefined

key[data]にするとundefined(indexに対応する値をアクセスするイメージ的にこっちのほうがわかりやすいきがするんですけど。。。
今の自分なりの考えです
3行目の文でkeyにはfor in文で仮引数に渡しているためインデックス番号が表示され、それがfor分によってループされて、0~4のインデックス番号が出力される。
deta[key]ではkeyの値を一つ一つ取り出す作業を実行しているんだと思うけど、何でインデックス番号じゃなくプロパティが取り出されるんでしょうか、、、、、、、、、、
連想配列の理解やプロパティのアクセスの方法の理解が間違っている???

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

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

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

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

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

guest

回答2

0

JSではプロパティは連想配列のキーのように扱えます

js

1let x = {y:"hoge",1:"fuga"} 2x.y === x["y"] 3//x.1 === x[1] 4//x.1が error

その中で,識別子として有効なものが左辺のようにアクセスできます
配列のindexとプロパティは同じアクセス方法なので質問コードのような挙動になります

この挙動のゆえに配列でのfor...in構文は推奨されていません
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in#array_iteration_and_for...in
数値のインデックスに加えてユーザー定義プロパティの名前も返しますし,順番の保証もありません

投稿2021/05/08 14:56

編集2021/05/08 15:03
taC-h

総合スコア289

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

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

退会済みユーザー

退会済みユーザー

2021/05/08 15:47

for in文非推奨のURLを貼ってくださりありがとうございます。for in for ofの挙動を理解していたつもりだったので、わからないのが気持ち悪くて 質問しました。実際は基本的なアクセス方法をとっているだけで難しく考えていました。 このような質問に答えてくださりありがとうございました(T_T)
退会済みユーザー

退会済みユーザー

2021/05/08 15:51

重ねて申し訳ないのですが、自分の処理の手順の理解は正しいのかおしえていただければありがたいです、、、
taC-h

2021/05/08 16:05

>for in文で、dataが仮引数keyに格納される 正しくは for in文で、dataの各プロパティ(またはindex)がループごとに変数keyに格納される ですね それ以外は正しいと思われます
退会済みユーザー

退会済みユーザー

2021/05/08 16:09

>for in文で、dataの各プロパティ(またはindex)がループごとに変数keyに格納される その考え方のほうがfor inの挙動でしっくり来ました。丁寧に回答してくださりありがとうございました!!!
guest

0

ベストアンサー

for in文で、dataが仮引数keyに格納される

keyに入るのは01のような添字です。dataそのものではありません。

投稿2021/05/08 14:15

maisumakun

総合スコア146018

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

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

maisumakun

2021/05/08 14:23 編集

> data[key]でアクセスしても、keyにはインデックス番号が入っているのに、なぜxのプロパティが出力されるのかがわかりません。 data===xですので、配列をインデックス番号でアクセスすれば中身が取れる、ごく当然の挙動だと思うのですが何が疑問なのでしょうか?
退会済みユーザー

退会済みユーザー

2021/05/08 15:45

>配列をインデックス番号でアクセスすれば中身が取れる 理解しました。 let y = [1, 3, 4, 5, 5] console.log(y[0]); のようなアクセス方法しか頭になく、基本的な考えが浅はかでした。 このような質問に答えてくださりありがとうございました(T_T)
退会済みユーザー

退会済みユーザー

2021/05/08 15:52

すみません、重ねて申し訳ないのですが、自分の処理手順の理解は概ね正しいのでしょうか、、教えていただけたらありがたいです、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問