5

mdn より: Spread Syntax

注: 通常、ES2015 の拡散演算子は、配列のコピー中に 1 レベルの深さになります。したがって、多次元配列のコピーには適していません。Object.assign() および Object スプレッド構文の場合も同様です。理解を深めるために、以下の例を見てください。

var a = [[1], [2], [3]];
var b = [...a];
b.shift().shift(); // 1
// Now array b is: [[2], [3]]

上記のステートメントのポイントは何ですか? 上記のコード サンプルは、.slice() メソッドを使用して a の配列を b にコピーした場合とまったく同じように機能します。https://repl.it/HKOq/2の配列に別の次元を追加しようとしましたが、それでも期待どおりに機能しました。

では、スプレッド構文が多次元配列のコピーに適していないのはなぜでしょうか?

助けていただければ幸いです。

編集:

estus と vol7ron の回答を読むと、理解するのに役立ちました。基本的に、estus が技術的に指摘しているように、多次元配列ではなく、配列内に配列があるだけです。

また、vol7ron が説明しているように、配列の最初のレベルのみがコピーされるため、メモリ内のオブジェクトは、さらにネストされた要素に対して同じままです。

また、スプレッド構文の使用がスライス演算子とは異なる動作をするはずだったと疑ったのも間違っていました

4

4 に答える 4

0

したがって、この例が伝えようとしているのは、 (eg )の内部配列を展開var b = [...a];するのではなく、 になるということです。したがって、 は最初の要素を削除して返し、次に 2 番目の要素をその返された配列から削除します。一言で言えば、拡散配列の 1 レベル下に到達するだけです。たとえば、は と同等ですが、例にはありませんab = [1,2,3]b[[1],[2],[3]]b.shift()b[1]shift()1...var b =[...a]var b = [a[0], a[1], a[2]]var b = [ a[0][0], a[1][0], a[2][0] ]

于 2017-04-15T03:04:32.590 に答える