まずは、標準配列は、名前だけarray indexes *、特別length
財産、そしてそのプロトタイプとしてArray.prototype
である特性の特殊な処理でオブジェクトであることを覚えてみましょう。配列インデックスはプロパティ名です(技術的には仕様レベルではの文字列 —ですが、実装はそれらを最適化します)。それはそれはそれは、アレイ上で呼び出されていていることを確認していません —「故意に汎用的」だから
我々はそう長くlength
性質を持っている上でそれを呼び出してオブジェクトとして、非配列オブジェクトにcopyWithin
を使用することができます。
オリジナルオブジェクト{length: 5, 3: 1}
は、2つのプロパティ:"length"
(値5)と"3"
(値1)の2つのプロパティを持っています。次に、copyWithin(obj, 0, 3)
呼び出しが行われます。これは、「インデックス3から始まるエントリを、 '配列'の終わりからインデックス0にコピーします。そう非常おおよそ:存在しないので、スキップされ、その後source
ため停止され、次いで
var target = 0;
var source = 3;
while (source < obj.length) {
if (source in obj) { // If the object has this property...
obj[target] = obj[source]; // ...copy it
}
++target;
++source;
}
だから、プロパティ"0"
にプロパティ"3"
(値1)をコピーしてしまう、プロパティ"4"
に移動します、もう< obj.length
ではありません。
MDN's polyfill for copyWithin
とthe specを読んで、それが何であるかを知ることが有用な場合があります。
*そのリンクから:
整数インデックスは、標準的な数値文字列である文字列の値を持つプロパティのキーである(7.1.16を参照)、その数値のいずれかである0または正の整数≦2 -1です。 配列インデックスその数値I整数インデックス私≤範囲+0である-1。
ドキュメントを読むときに混乱しているものを理解するのは難しいです。 –
@FelixKling答えが明らかになります。私はプロパティのインデックス値について考えていませんでした。 – user5389726598465
"*は位置4の0番目にコピーされた4番目の値を持ちます。" - そうです。 '3:1' *は4番目の場所であることに注意してください。なぜあなたはそれが駄目になると思いますか? – Bergi