根据 ecma262-3 8.6.2.6 [DefaultValue]
http://bclary.com/2004/11/07/#a-8.6.2.6
现在我想获得 [] 的 [[DefaultValue]]
所以根据 ecma,像这样:
当 O 的 [[DefaultValue]] 方法用提示 Number 调用时,采取以下步骤:
1. 用参数 "valueOf" 调用对象 O 的 [[Get]] 方法。
[ ].valeOf() => [ ]//本身
2.如果Result(1)不是一个对象,转到步骤5。
[ ]是一个对象
3.调用Result(1)的[[Call]]方法, O 作为 this 值和一个空的参数列表。
Result(1) => [ ],[ ] 不实现 [[Call]]
4. 如果 Result(3) 是原始值,则返回 Result(3)。
所以,没有结果(3),或者它仍然是[]
5. 使用参数“toString”调用对象 O 的 [[Get]] 方法。
[ ].toString => ""
6. 如果 Result(5) 不是对象,转到步骤 9。
Result(5) => "" 不是对象,转到步骤 9
7. 调用 [[Call] ] Result(5) 的方法,其中 O 作为 this 值和一个空参数列表。
8. 如果 Result(7) 是原始值,则返回 Result(7)。
9. 抛出 TypeError 异常。
错误?上帝!
问问题
952 次
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 回答