как получить объект [[DefaultValue]] - PullRequest
0 голосов
/ 28 апреля 2011

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

Ошибка?бог!

1 Ответ

1 голос
/ 29 апреля 2011

[[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"
...