Does console.log вызывает метод toString объекта?

В соответствии с этой документацией,

Строковые представления каждого из этих объектов добавляются вместе в порядке, указанном и выводимом.

Также как ответ

+ x заставляет объект x в строку, которая является просто [объектом Объект]:

Итак, мой вопрос:

Если я делаю

str = new String("hello")
console.log(str) //prints the string object but not 'hello'
console.log(""+str) //prints "hello"

Итак, в первом случае он просто печатает объект (не вызывает метод toString()).

Но во втором случае он не принуждает, а просто печатает примитивное значение. Почему это так?

Какой метод вызывает console.log для печати объекта?

Обратите внимание, что это не дубликат этого question.

Ответ 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, поэтому я не буду комментировать это.

Ответ 2

console.log(str) вызывает str.valueOf() Я думаю. Из JavaScript - окончательное руководство Его задачей является преобразование объекта в примитивное значение. Метод valueOf() вызывается автоматически, когда объект используется в числовом контексте, например, с арифметическими операторами (кроме +) и с реляционными операторами. Большинство объектов не имеют разумного примитивного представления и не определяют этот метод.

--- edit ---- Извините, скопируйте неправильную строку, я имею в виду "+", так как там конвертируется тип

Ответ 3

Он не использует toString, вы можете сделать что-то вроде этого

clog = function(msg){console.log(msg.toString());}
clog(myObj);