Делает консоли.log вызывает метод toString объекта?

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

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

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

+ x объединяет объект x в строку, которая является просто [object Объект]:

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

Если я делаю

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

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

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

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

обратите внимание, что это не дубликат этот вопрос.

3 ответов


Console API не является стандартным API, который определен в любой спецификации, но является чем-то, что реализовано во всех браузерах, поэтому поставщики обычно вольны реализовывать по-своему, поскольку нет стандартной спецификации для определения вывода любых методов в API.

если вы не проверяете фактическую реализацию API консоли для конкретного браузера, вы никогда не можете быть уверены. Есть трекер на GitHub перечисляя различия между реализация из основных браузеров.

если вы посмотрите на реализацию в FF (доступно здесь - поиск журнала), он имеет комментарий ниже

многострочная струнификация объекта, предназначенная для использования людьми

фактическая реализация проверяет тип аргумента, который передается в log() и на основе его типа он генерирует другое представление.

приходя к вашему делу, log() печатает два разных значения для строк, созданных с помощью literal обозначения и строки, созданные с помощью String конструктор, потому что они два разных types. Как объяснил здесь, строки, созданные с использованием буквенной нотации, называются String Primitives и строки, созданные с помощью строкового конструктора, называются String Objects.

var str1 = 'test';
var str2 = new String('hello');

typeof str1 // prints "string"
typeof str2 // prints "object"

поскольку типы отличаются, их строковое представление отличается в API консоли. Если вы пройдете через код для реализации консоли FF, последнее утверждение

return "  " + aThing.toString() + "\n";

Итак, чтобы ответить на ваш вопрос, консольный API в FF calls toString() на аргумент, только если тип аргумента не является одним из {undefined,null,object,set,map} типы. Он не всегда звонит toString() или valueOf() методы. Я не проверял реализацию Chrome, поэтому я не буду комментировать это.


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

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


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

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