1. ホーム
  2. javascript

[解決済み] Array.prototype.slice.call`はどのように機能するのですか?

2022-03-19 23:26:06

質問

を作るのに使われているのは知っています。 arguments 本物の Array を使用するとどうなるのか、よくわかりません。 Array.prototype.slice.call(arguments); .

解決方法は?

ボンネットの中で何が起こっているかというと .slice() が普通に呼ばれる。 this はArrayで、そのArrayに対して繰り返し処理を行うだけです。

どのように this の中に .slice() 関数はArrayですか?なぜなら、そうすると

object.method();

... object の値に自動的になります。 this の中で method() . というわけで。

[1,2,3].slice()

... [1,2,3] の値として、配列が設定されます。 this.slice() .


しかし、何か他のもので代用できるとしたらどうでしょう。 this の値は?代用したものが数字である限り .length プロパティと、数値のインデックスを持つプロパティの束があれば、うまくいくはずです。このようなオブジェクトは、しばしば 配列的オブジェクト .

.call().apply() メソッドを使用すると 手動で の値を設定します。 this を関数で実行します。ですから、もし this.slice() 配列のようなオブジェクト , .slice() は、単に とする は、Arrayで動作していると判断し、その通りに動作します。

このプレーンなオブジェクトを例にしてみましょう。

var my_object = {
    '0': 'zero',
    '1': 'one',
    '2': 'two',
    '3': 'three',
    '4': 'four',
    length: 5
};

これは明らかにArrayではないのですが、もしこれを this の値です。 .slice() の配列のように見えるので、うまくいくでしょう。 .slice() が正しく動作するようにします。

var sliced = Array.prototype.slice.call( my_object, 3 );

http://jsfiddle.net/wSvkv/

コンソールで確認できるように、期待通りの結果になっています。

['three','four'];

を設定すると、こうなるわけです。 arguments オブジェクトを this の値です。 .slice() . なぜなら arguments には .length プロパティと数値インデックスの束です。 .slice() は、あたかも本物のArrayを操作しているかのように動作します。