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

Согласно этой документации,

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

Также согласно ответу

+ x преобразует объект x в строку, которая представляет собой просто [object Object]:

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

If I do

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

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

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

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

Обратите внимание: это не дубликат этого вопроса .


person gurvinder372    schedule 25.03.2016    source источник
comment
Ваш вопрос ограничивается Mozzilla?   -  person Roberto    schedule 25.03.2016
comment
@Roberto Нет, это не ограничивается Mozzila.   -  person gurvinder372    schedule 25.03.2016


Ответы (4)


Консольный 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
comment
Теперь это стандарт, и вы можете обновить свой ответ, чтобы отразить это. - person Benjamin Gruenbaum; 14.08.2018
comment
То, что str2 печатает объект типа, является одной из причин, по которой руководство по стилю Google говорит никогда не используйте new в оболочках примитивных объектов - person Josh Desmond; 23.03.2021

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

clog = function(msg){console.log(msg.toString());}
clog(myObj);
person A.Zaben    schedule 10.08.2016

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

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

person cyl19910101    schedule 25.03.2016
comment
Нет, console.log(str.valueOf()) и console.log(str) дают разные результаты - person gurvinder372; 25.03.2016

Это больше набирает, но также вызовет obj.toString():

console.log(`${obj}`);
person baz    schedule 28.11.2020