如何获取对象的[[DefaultValue]]

时间:2011-04-28 07:08:51

标签: javascript ecma262

根据ecma262-3 8.6.2.6 [DefaultValue]
http://bclary.com/2004/11/07/#a-8.6.2.6
现在我想得到[] 的[[DefaultValue]] 所以根据ecma,像这样:
当使用提示号调用O的[[DefaultValue]]方法时,将执行以下步骤:
1。使用参数“valueOf”调用对象O的[[Get]]方法。
[] .valeOf()=> [] //本身
2。如果Result(1)不是对象,请转到步骤5.
[]是一个对象
3。调用Result(1)的[[Call]]方法,将O作为该值和空参数列表。
结果(1)=> [],[]不实施[[Call]]
4。如果Result(3)是原始值,则返回Result(3)。
所以,没有结果(3),或者它仍然是[]
5。使用参数“toString”调用对象O的[[Get]]方法。
[] .toString => “”
6。如果Result(5)不是对象,请转到步骤9.
结果(5)=> “”不是对象,请转到第9步
7。调用Result(5)的[[Call]]方法,将O作为该值和空参数列表 8.如果Result(7)是原始值,则返回Result(7) 9.抛出TypeError异常。
错误?神<!/强>

1 个答案:

答案 0 :(得分: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"