ecma262-3 8.6.2.6 [DefaultValue]
http://bclary.com/2004/11/07/#a-8.6.2.6によると
、[] の [[DefaultValue]] を取得したい
ので、ecma によれば、 O の[
[DefaultValue]] メソッドがヒント Number で呼び出されると、次の手順が実行されます
。 1. オブジェクト O の [[Get]] メソッドを引数「valueOf」で呼び出します。
[ ].valeOf() => [ ]//itself
2. Result(1) がオブジェクトでない場合は、手順 5 に進みます。
[ ] はオブジェクトです
。 3. Result(1) の [[Call]] メソッドを呼び出します。 、この値として O と空の引数リストを指定します。
Result(1) => [ ],[ ] don't implement [[Call]]
4. Result(3) がプリミティブ値の場合、Result(3) を返します。
そう、結果(3)がない、またはまだ [ ]
5. オブジェクト O の [[Get]] メソッドを引数「toString」で呼び出します。
[ ].toString => ""
6. Result(5) がオブジェクトでない場合は、手順 9 に進みます
。Result(5) => "" がオブジェクトでない場合は、手順 9 に進みます
。 7. [[Call]を呼び出します。 ] Result(5) のメソッド。この値は O で、引数リストは空です。
8. Result(7) がプリミティブ値の場合、Result(7) を返します。
9. TypeError 例外をスローします。
エラー?神様!
1 に答える
1
[[DefaultValue]]
配列オブジェクトで呼び出されると、最終的に配列オブジェクトのtoString
メソッドに到達 (および呼び出し) します。そのメソッドは本質的に、配列オブジェクトのArray.prototype.toString
呼び出しと同じですArray.prototype.join
(15.4.4.2 を参照)。したがってtoString
、空の配列オブジェクトでは、空の文字列 ( ""
) が返されます。これはプリミティブ値であるため、[[DefaultValue]] 内部メソッドから返されます。
したがって、配列の [[DefaultValue]] は空の文字列です —が上書き/シャドウされていない場合 Array.prototype.string
、および Array.prototype.valueOf
が上書き/シャドウされていない場合。
[]+''; // ""
Array.prototype.toString = function(){return 1};
[]+''; // "1"
Array.prototype.valueOf = function(){return 2};
[]+''; // "2"
于 2011-04-29T04:24:54.057 に答える