根据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异常。
的错误?神<!/强>
答案 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"