Как console.log (объект) работает в фоновом режиме? - PullRequest
3 голосов
/ 01 ноября 2019


У меня есть этот код:

const obj = {name: 'maro', age: 77}

console.log(obj); // it logs { name: 'maro', age: 77 }

Кажется очевидным! но я хочу знать, как console.log внутренне работает? какие методы "obj" он вызывает для получения "{name: 'maro', age: 77}"

obj содержит эти свойства:

obj.__defineGetter__      obj.__defineSetter__      obj.__lookupGetter__      obj.__lookupSetter__      obj.__proto__             obj.constructor           obj.hasOwnProperty
obj.isPrototypeOf         obj.propertyIsEnumerable  obj.toLocaleString        obj.toString              obj.valueOf    obj.age        obj.name

Но ни одно из них не возвращает "{name: 'maro', age: 77} "!

даже obj.toString() возвращает '[object Object]'

Ответы [ 4 ]

2 голосов
/ 01 ноября 2019

Это obj.valueOf(), если я не ошибаюсь. Вот документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf

1 голос
/ 01 ноября 2019

Как вы можете видеть в Node.js console.log документации , он использует за кулисами util.format для форматирования своего вывода.

Согласноutil.format документация , она возвращает строковое представление объекта с общим форматированием объекта JavaScript, аналогично util.inspect.

Вы можете увидеть его фактическую реализацию, по крайней мере для Node.js , здесь: https://github.com/nodejs/node/blob/75dc8938a40100a53323ed87159a1ab2f149ceca/lib/internal/util/inspect.js#L1567. Весело читайте этот код:)

0 голосов
/ 01 ноября 2019

Вы можете использовать valueOf ().

const object1 = {name:"ankit",age:27}
console.log(object1.valueOf());

Примечание. Объекты в строковом контексте преобразуются с помощью метода toString (), который отличается от объектов String, преобразующих в строковые примитивы с использованием valueOf. Все объекты имеют строковое преобразование, если только «[тип объекта]». Но многие объекты не преобразуются в число, логическое значение или функцию.

0 голосов
/ 01 ноября 2019

Если вам нужно имя 'maro' и возраст 77, вам нужно использовать obj.name и obj.age ...

...