1
function test()
{
alert(Array.join.call(arguments,'/')) //alerts /
alert(Array.prototype.join.call(arguments,'/')) //alerts Js/JScript
alert(Array.join(arguments,'/')) //alerts Js/JScript
}
test('Js','JScript');

なぜこの違いがあるのですか?なぜ最初にプロトタイプを参照する必要があるのですか?また、joinがseparator引数のみを期待している場合でも、Array.joinだけで必要な結果が得られるのはなぜですか。

4

2 に答える 2

5

Array.joinグローバル関数です。callを使用する場合、最初の引数として渡すのは、関数の本体thisのオブジェクトであり、次に関数の引数です。joinjoin

js> Array.join.call(null, [1, 2], "/")   
"1/2"

Array.prototype.joinのインスタンス用ですArraythisしたがって、実際の配列であることが期待されます。これが、2番目の例が機能する理由です。Array.prototype.join2番目の例は、thisオブジェクトがである状態で呼び出すことになります。argumentsこれは正確にはですarguments.join("/")説明については、 MDNを参照してください。

于 2012-05-26T15:53:50.280 に答える
1

Arguments配列は実際には実際の配列オブジェクトではないため、これが必要です。。仕様では「配列のような」と呼んでいますが、。など、JavaScript配列に通常関連付けられているメソッドは含まれていませんjoin

したがって、上記のコードが実行しているのは、Arrayメソッドを直接呼び出し、を使用してcall、メソッドのスコープとしてArgumentsオブジェクトを渡すことです。

基本的に、インタプリタはArguments配列を実際の配列として扱い、それらのメソッドを実行できるようにします。

于 2012-05-26T15:49:06.337 に答える