как получить объект [[DefaultValue]]

согласно ecma262-3 8.6.2.6 [DefaultValue]
http://bclary.com/2004/11/07/#a-8.6.2.6
теперь я хочу получить [[DefaultValue]] из [ ]
, поэтому согласно ecma, вот так:
Когда метод [[DefaultValue]] O вызывается с номером подсказки, выполняются следующие шаги:
1. Вызвать метод [[Get]] объекта O с аргументом "valueOf".
[ ].valeOf() => [ ]//сам по себе
2. Если Результат(1) не является объектом, перейдите к шагу 5.
[ ] является объектом
3. Вызовите метод [[Call]] для Result(1) с O в качестве значения this и пустым списком аргументов.
Result(1) => [ ],[ ] не осуществить [[Вызов]]
4. Если Результат(3) является примитивным значением, вернуть Результат(3).
так что Результата(3) нет, или он по-прежнему [ ]
5. Вызвать метод [[Get]] объекта O с аргументом "toString".
[ ].toString => ""
6. Если Результат(5) не является объектом, перейдите к шагу 9.
Результат(5) => "" не является объектом, перейдите к шагу 9
< эм>7. Вызов метода [[Call]] результата(5), с O в качестве значения this и пустым списком аргументов.
8. Если Результат(7) является примитивным значением, вернуть Результат(7).
9. Выдать исключение TypeError.
ошибка? боже!


person free    schedule 28.04.2011    source источник


Ответы (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"
person kangax    schedule 29.04.2011