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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

7614閲覧

JavaScriptのオブジェクトを配列に変換するとき、arguments を使うと変換がおかしくなる現象について

konsai

総合スコア8

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/01/03 20:50

以下func1()でオブジェクトを配列に変換することができています。

js

1func1(); 2function func1() { 3 4 var obj = { 0:'hoge', 1:'huga', 2:'piyo' }; 5 6 console.log( Object.keys(obj).map(function (key) {return obj[key]}) ); 7 // Array(3) [ "hoge", "huga", "piyo" ] 8}

しかし下記func2()argumentsの場合、これはfunc1()と同じオブジェクトであり、さらにfunc1()と同じ操作をしているのに、結果が変わってしまうのはなぜですか?

一番最後の行にあるように// > Array ["0", 1, Array ["0", "1", "2"]]という結果になってしまうのです。

そしてどのようにすれば、下記argumentsfunc1()と同じ配列にできますでしょうか?

js

1func2( 'hoge', 'huga', 'piyo' ); 2function func2() { 3 4 console.log( arguments ); 5 // > Object { 0:'hoge', 1:'huga', 2:'piyo' } 6 7 console.log( Object.keys(arguments).map(function (key) {return arguments[key]}) ); 8 // > Array ["0", 1, Array ["0", "1", "2"]] 9}

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

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

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

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

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

guest

回答2

0

ベストアンサー

MDN Arguments

Arguments は length プロパティを持ったArray風オブジェクトになります。
順番に引数の値を取り出したい場合は Array に矯正する必要があります。

// 古典的手法(MDN にも掲載されている手法) function func2() {  let args = Array.prototype.slice.call(arguments, 0) console.log( args ); } // Array.from() を用いる function func3() {  let args = Array.from(arguments) console.log( args ); } // 引数にスプレッド構文を指定 function func4(...args) { console.log( args ); }

こちらは、受け取った引数の値をオブジェクトにする例

javascript

1function d(...args) { 2 let oj = args.reduce( (acc, arg, idx) => {acc[idx]=arg; return acc}, {}); 3 console.log( oj ) 4} 5d("hoga","hogi","hogu")

投稿2020/01/03 21:15

編集2020/01/03 21:33
AkitoshiManabe

総合スコア5432

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

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

konsai

2020/01/04 13:55

こんなに詳しく、どうもありがとうございました。Array.from()の方法がわかりやすいかと思ったので使わせて頂きます。
guest

0

mapのコールバックの中でのargumentsは、コールバック関数に与えられた引数のほうを指してしまい、外側のargumentsとは異なってしまいます。

コールバック関数をarrow functionで書く、あるいは外側のargumentsを別な名前の変数に入れておく、などの対策が必要です。

投稿2020/01/03 22:29

maisumakun

総合スコア145184

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

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

konsai

2020/01/04 13:56

ありがとうございます。納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問