問題タブ [spread-syntax]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - ES6 JS のスプレッド構文は関数の引数としてどのように機能しますか?
わかりましたので、新しいスプレッドが関数パラメーターとしてどのように機能するかを理解しようとしています。パラメーターの数が不明な関数を想像して、それらをすべて一緒に追加します。
この機能は明らかに機能します。それで、私の問題は何ですか?さて、ここにいくつかの観察があり、その後に私の問題があります:
- 関数のパラメーター/引数としての拡散構文は、値の配列を個別の引数として「拡散」するように設計されているようです。
私が行った調査に基づいて、スプレッド構文を使用して、標準として配列を引数として受け入れない関数に配列を渡すことができます。たとえば、Array.prototype.push() を使用する必要はありませんapply
。
ただし、この場合に渡される配列は、push
事前に宣言/定義する必要があります (この場合y
)
- これは、関数内の引数オブジェクトの長さを調べることで確認されます
私が使用するaddNums(1,2,3,4)
と、arguments.length
まだ== 4です。そのため、関数もまだ呼び出されているようですaddNums(1,2,3,4)
問題
私の問題はaddNums
、スプレッド構文を処理するための引数として配列を呼び出していないことです。私は呼び出していません私addNums([1,2,3,...])
が理解するのに苦労している動作は、単一の引数としてスプレッド構文で宣言された関数が与えられた場合、秘密の隠されたステップがあるように見えるということです:
次に、引数のリストを指定して呼び出します。
arguments
オブジェクトの生成がありますANDArray
型の変数も、関数パラメーターと同じ名前で、スプレッド構文で作成されます。
おそらくこれは、より経験豊富なコーダーにとって明白または些細なことですが、未知の長さのパラメーターのセットに値の配列を分散させるなど、これまでに提案されたユースケースには直感に反するように思えます。
実際、関数が複数のパラメーターで呼び出され、スプレッド構文で単一のパラメーターで定義されている場合、パラメーター間で配列を読み取って分割するのではなく、スプレッド構文は実際には次のように機能します。 :Array.apply(null, arguments)
またはvar a = [arg1, arg2, ...]
- ** スプレッダーではなく作成者です **
私の研究の情報源:
- http://es6-features.org/#SpreadOperator
- https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_Syntax
- 展開構文 ES6
特に、質問に対するコメント「@void 主に関数呼び出しで使用されます。つまり、myFunc が不明な数の引数を取る場合、スプレッドのある配列として引数を与えることができます。このように: myFunc(...dynamicallyGeneratedArgs)」
javascript - console.log(...arguments) が問題ないのに、なぜ var a = ...arguments が失敗するのですか?
コード A、これは OK で、ログに記録します[ 1, 2, 3 ]
コード B、これは次のエラーで失敗します。SyntaxError: Unexpected token ...
また、ラップ...arguments
して()
も役に立ちません。
どちらの場合も、RHS
ルックアップがあると思います。(または他の関数)に渡すことは問題ないが、変数に代入することは問題ないのはなぜ...arguments
ですかconsole.log
?
PS。これは実際のコードでは決して成り立たないこと、またはこれに対する他のより良い解決策があることを私は知っています。私の質問は純粋に理論的/概念的なものであり、異なる動作が発生する理由を理解することに限定されています。
javascript - スプレッド構文を使用した ES6 でのディープ コピー
配列ではなくオブジェクトで動作する Redux プロジェクト用のディープ コピー マップ メソッドを作成しようとしています。Redux では、各状態は以前の状態で何も変更されるべきではないことを読みました。
できます:
ただし、内部アイテムをディープコピーしないため、次のように微調整する必要があります。
これは、どのオブジェクトが渡されるかを知る必要があるため、エレガントではありません。ES6 でスプレッド構文を使用してオブジェクトをディープ コピーする方法はありますか?
javascript - なぜbabelは、react-starter-kitでのスプレッド演算子のこの使用法を理解していないのですか?
react-starter-kit
非常に人気のあるボイラープレートであるから:
この行は、実行またはビルドしようとすると常に失敗します。
エラー:
拡散作業の他の例を信じています。
私は、明らかな一連の救済策であると私が信じていることを試しました。
- 削除
node_modules
して再インストールする - 剪定
babelrc
- 使用する場合と使用
babelrc
しない場合babelrc
(この場合、デフォルトは後者です) - さまざまな
babel
プリセット - ブードゥー教
リポジトリがビルドすると言っていて、私はそれらを信頼しているので、これは私を夢中にさせていますが、それは私のためにビルドされていないようです.