Консольный API не является стандартным API, который определен в какой-либо спецификации, но реализуется во всех браузерах, поэтому поставщики обычно имеют право реализовывать по-своему, поскольку нет стандартной спецификации для определения вывода любых методов в API. .
Пока вы не проверите фактическую реализацию Console 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, последний оператор
return " " + aThing.toString() + "\n";
Итак, чтобы ответить на ваш вопрос, Console API в FF вызывает toString()
для аргумента, только если тип аргумента не является одним из типов {undefined,null,object,set,map}
. Он не всегда вызывает методы toString()
или valueOf()
. Я не проверял реализацию Chrome, поэтому не буду это комментировать.
person
Arkantos
schedule
25.03.2016