`Array.prototype.slice.call` はどのように機能しますか? 質問する

`Array.prototype.slice.call` はどのように機能しますか? 質問する

arguments実際の を作成するために使用されることは知っていますArrayが、 を使用すると何が起こるのかわかりませんArray.prototype.slice.call(arguments);

ベストアンサー1

内部的には、.slice()通常どおり呼び出されるとthis配列になり、その配列を反復処理して作業を実行します。

this関数内で.slice()配列はどのようになっているのでしょうか? なぜなら、次のようにすると:

object.method();

... は自動的に のobjectの値になります。したがって、次のようになります。thismethod()

[1,2,3].slice()

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


しかし、値として何か他のものを代入できるとしたらどうでしょうかthis? 代入するものが数値プロパティと数値インデックスである一連のプロパティを持っている限り、それは機能するはずです。このタイプのオブジェクトは、配列のようなオブジェクト.lengthと呼ばれることがよくあります。

およびメソッドを使用すると、関数内の の値を手動で設定できます。したがって、内のの値を配列のようなオブジェクトに設定すると、は配列を操作していると想定し.call()その処理を実行します。.apply()thisthis.slice().slice()

この単純なオブジェクトを例に挙げます。

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

これは明らかに配列ではありませんが、thisの値として設定できる場合は.slice()、 の配列のように見えるため、.slice()正常に機能します。

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

例: http://jsfiddle.net/wSvkv/

コンソールでわかるように、結果は期待どおりです。

['three','four'];

オブジェクトをの値argumentsとして設定すると、このようなことが起こります。 にはプロパティと一連の数値インデックスがあるため、は実際の配列を操作しているかのように動作します。this.slice()arguments.length.slice()

おすすめ記事