Aray.prototype.slice.apple(argments)と[].slie.apple(argments)解析

2733 ワード

関数内部のargmentsはクラスの配列オブジェクトであり、本物の配列ではないので、配列の様々な方法が使えないことを知っています.argmentオブジェクトを詳しく知りたいのですが、関数の中のargmentsに行けばいいです.
(function fun(){
	console.log(arguments.reverse());		//  
})();
Array.prototype.slice.apply(arguments)および[].slice.apply(arguments)は、argmentsを本物の配列に変換することができる.
(function fun(){
	var arr = Array.prototype.slice.apply(arguments);
	var arr2 = [].slice.apply(arguments);
	console.log(arr);		//[18,23]
	console.log(arr.reverse());		//[23,18]
	console.log(arr2);		//[18,23]
	console.log(arr2.reverse());		//[23,18]
})(18,23);
もちろんここではcallの方法やbindの方法で同じ結果を待つこともできます.この3つの方法の違いと使い方は、appy()、call()とbind()の用法と違いを参照することができます.
(function fun(){
	var arr = Array.prototype.slice.apply(arguments);
	var arr2 = Array.prototype.slice.call(arguments);
	var arr3 = Array.prototype.slice.bind(arguments)();
	console.log(arr);		//[18,23]
	console.log(arr.reverse());		//[23,18]
	console.log(arr2);		//[18,23]
	console.log(arr2.reverse());		//[23,18]
	console.log(arr3);		//[18,23]
	console.log(arr3.reverse());		//[23,18]
})(18,23);
Aray.prototype.slie.appley(argments)
外から中を見てみましょう.apply()メソッドは、関数内部のthisを指定のオブジェクトにバインドすることができます.この方法は2つのパラメータを受信します.最初は新しいthisオブジェクトで、2番目はパラメータ配列です.関数呼び出しにパラメータが必要でない場合は省略できます.そこでここではAray.prototype.slice内部のthisオブジェクトをargmentsとして結びつけます.slice()方法は、選択された要素を既存の配列から返すことができる.この方法は2つのオプションのパラメータを受信する.最初は最初の選択された位置で、2番目は終了位置である.両方のパラメータがパスされない場合、デフォルトは0から終了までです.関数が呼び出されてコンテキストオブジェクトが存在すると、関数内部のthisがこのコンテキストオブジェクトにバインドされる暗黙的バインディング規則が適用されることを知っています.thisのバインディングルールを知りたいなら、JavaScriptで関数のthisバインディングを判断できます.しかし、この式は、thisオブジェクトをargmentsと結合し、配列に変換します.なぜこうしますか?私たちはテストします.
var arr = [1,2,3];
var arr2 = [4,5];
console.log(arr2.slice());		//[4,5]
console.log(arr2.slice.apply(arr));		//[1,2,3]
以上から分かるように、slice()のthisオブジェクトをarr 2からarrに変更すると、slice()メソッドの作用対象はarrになります.簡単にslice()方法の実現コードを推測できます.
Array.prototype.slice = function(start,end){
	var result = new Array();
	start = start || 0;
	end = end || this.length; 
	for(var i = start; i < end; i++){
		result.push(this[i]);
	}
	return result;
}
上記のコードから、なぜAray.prototype.slice.appleyがargmentsを本物の配列に変換できるのかが分かります.最初に配列を作成して、次の標的を押して、最後にこの配列に戻ります.
[].slite.apple(argments)
コードがあるオブジェクトの属性を読み取るたびに、検索を実行します.名前の属性を指定します.検索はまず、オブジェクトのインスタンス自体から開始します.指定された名前の属性がインスタンスで見つかった場合、属性の値を返します.見つかっていない場合は、ポインタが指すプロトタイプのオブジェクトを検索し続け、プロトタイプのオブジェクトから指定された名前の属性を検索します.プロトタイプオブジェクトにこの属性が見つかったら、その属性の値を返します.[]は空の配列で、元のオブジェクトはAray.prototypeです.テストしてみます.
console.log([].__proto__ === Array.prototype);		//true
したがって[].slite.apple(argments)は本質的にAray.prototype.slite.appley(argments)と同じで、目的はすべてslice()を呼び出すことです.