2017-11-02 3 views
1

これはMDN documentationからです:js Array.prototype.copyWithin(target、start、end)はオブジェクトリテラルで呼び出されたときに何をしますか?

[].copyWithin.call({length: 5, 3: 1}, 0, 3); 
// {0: 1, 3: 1, length: 5} 

マイ混乱し誤解:1から来る:プロパティ0はない ? 2つのプロパティを持つ非配列オブジェクトは、4番目の値から0番目にコピーされた値を持つので、noopになります。出力は反転し、新しいプロパティ{0 1}:

[undefined, undefined, undefined, 1, undefined] 

(5の長さ、およびインデックス3で1)

+1

ドキュメントを読むときに混乱しているものを理解するのは難しいです。 –

+0

@FelixKling答えが明らかになります。私はプロパティのインデックス値について考えていませんでした。 – user5389726598465

+0

"*は位置4の0番目にコピーされた4番目の値を持ちます。" - そうです。 '3:1' *は4番目の場所であることに注意してください。なぜあなたはそれが駄目になると思いますか? – Bergi

答えて

3

まずは、標準配列は、名前だけ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 copyWithinthe specを読んで、それが何であるかを知ることが有用な場合があります。


*そのリンクから:

整数インデックスは、標準的な数値文字列である文字列の値を持つプロパティのキーである(7.1.16を参照)、その数値のいずれかである0または正の整数≦2 -1です。 配列インデックスその数値I整数インデックス私≤範囲+0である-1。

+0

私の質問はすでに回答済みですが、他の2つのプロパティの逆転は、オブジェクトリテラルでプロパティの列挙を順序付けしてはならないからです。 – user5389726598465

+0

@ user135711「逆転」とはどういう意味ですか? – Bergi

+0

@ user135711:逆戻りはありません。私の元々の答えははっきりとはっきりしていなかったので、改善しました。 'copyWithin(obj、0、3)'は、 "index" 3で始まるプロパティを "index" 0にコピーし、次のインデックス(4と1)を続けると言う。ソースインデックスは ' ( 'end'引数が指定されていないので)ターゲットの' length'プロパティを返します。 –

3

ソース・アレイのようなオブジェクトは、次の配列とほぼ同等ですここで起こるまさに何インデックス0

にインデックス3で何

copyWithinコピー。ドキュメントから

arr.copyWithinにシーケンスをコピーするに

ターゲットゼロベースのインデックスを(ターゲット、開始)。負の場合、 のターゲットは最後から数えられます。

startオプション要素のコピーを開始するゼロベースのインデックス からです。負の場合、startは最後からカウントされます。

+0

それはなぜ1の値を持っていますか?それ以上のことはありません。それは配列のオペレーションではありません。 – user5389726598465

+3

@ user135711:プロパティ '3'の値が '1'なのでそれ以外に何が必要ですか? –

関連する問題