Ответ 1
Это работает, потому что это указано в не столь ясном вопросе в спецификации. Для начала вам нужно вставить в раздел 15.12.3 в описании абстрактной операции Str, который используется для преобразования значений в строковое представление. По сути, если вход является объектом, спецификация говорит, чтобы проверить наличие вызываемого значения с именем toJSON
. Подумайте об этом как о интерфейсе на Java или С#.
interface IAmJSON
{
string toJSON(string key);
}
Это точный текст из спецификации.
2. If Type(value) is Object, then a. Let toJSON be the result of calling the [[Get]] internal method of value with argument "toJSON". b. If IsCallable(toJSON) is true i. Let value be the result of calling the [[Call]] internal method of toJSON passing value as the this value and with an argument list consisting of key.
Наконец, объект даты имеет toJSON
, определенный в разделе 15.9.5.44.