Ответ 1
Консольный API не является стандартным API, который определен в любой спецификации, но является тем, что реализуется во всех браузерах, поэтому поставщики обычно имеют право реализовать по-своему, поскольку нет стандартной спецификации для определения вывода любого методов в API.
Если вы не проверите фактическую реализацию Консольного API для определенного браузера, вы никогда не сможете быть уверены. Там трекер на GitHub перечисляет различия между реализацией из основных браузеров.
Если вы посмотрите на реализацию в FF (доступно здесь - найдите журнал), у него есть комментарий ниже
Многострочная стробировка объекта, предназначенная для использования людьми
Фактическая реализация проверяет тип аргумента, который передается на log()
и на основе этого типа, генерирует другое представление.
Следуя вашему случаю, log()
печатает два разных значения для строк, созданных с использованием нотации и строк literal
, созданных с помощью конструктора String
, потому что они два разных types
. Как объяснено здесь, строки, созданные с использованием литерала, называются String Primitives
, а строки, созданные с использованием конструктора String, называются String Objects
.
var str1 = 'test';
var str2 = new String('hello');
typeof str1 // prints "string"
typeof str2 // prints "object"
По мере различения типов их строковое представление отличается в API консоли. Если вы выполните код для реализации FF Console, последний оператор
return " " + aThing.toString() + "\n";
Итак, чтобы ответить на ваш вопрос, API-интерфейс консоли в FF вызывает toString()
в аргументе, только если тип аргумента не является одним из типов {undefined,null,object,set,map}
. Он не всегда вызывает методы toString()
или valueOf()
. Я не проверял реализацию Chrome, поэтому я не буду комментировать это.