поведение метода toString () в объектах - PullRequest
3 голосов
/ 18 июня 2020

Итак, я читал книгу Js и наткнулся на этот прекрасный топ c преобразования объекта в примитив. В книге автор говорит:

По историческим причинам, если toString или valueOf возвращает объект, ошибки нет, но такое значение игнорируется (например, если метод не существует). Это потому, что в древние времена не было хорошей концепции «ошибки» в JavaScript.

Теперь я попробовал это, но не получил, как сказано в книге:

let user = {
    name: "John",
    money: 1000,

   toString(){
       return {
           name: 'Bong'
       };
   }
  };

  alert(user);

Я получил сообщение об ошибке в консоли:

Uncaught TypeError: невозможно преобразовать объект в примитивное значение

Однако, если я сделаю это

alert(user.toString()); 

Тогда ошибки нет, выдается [Object object]

Пожалуйста, объясните это поведение.

Ответы [ 3 ]

5 голосов
/ 18 июня 2020

В первом случае user.toString вызывается неявно, потому что alert ожидает строку, а user не является строкой. Когда вызывается user.toString() и возвращаемое значение не является строкой, выдается ошибка.

Во втором случае user.toString вызывается явно вами, не имеет значения, если его имя toString или нет, потому что он возвращает внутренний объект, как и любой другой метод (здесь не ожидается примитивного значения). Затем внутренний объект передается в alert, и его toString вызывается неявно, что возвращает строку, потому что она не переопределена. Второй случай для ясности можно разбить на две части:

let obj = user.toString();    // first user.toString gets called, it will return the inner object
alert(obj);                   // obj.toString will implicitly gets called and since that will return a string everthing will be fine

Если внутренний объект имеет toString, который возвращает объект, то второй случай тоже не будет работать:

let user = {
  name: "John",
  money: 1000,

  toString() {
    return {
      name: 'Bong',
      toString() {                  // toString of the inner object is overridden
        return {};                  // ... and it returns an object
      }
    };
  }
};

alert(user.toString());            // now even the second case won't work because when toString of the inner object is called, a string is expected, but instead an object is returned which is a no no
1 голос
/ 18 июня 2020

[object Object] - строковое представление объекта по умолчанию.

Когда вы вызываете объект; toString() вызывается для объекта, и первоначальная реализация возвращает [object Object].

Если вы хотите просмотреть объект, вы можете просмотреть его через console.log или через JSON.stringify(). Вы также можете l oop просмотреть все свойства и проверить их по отдельности.

Пример :

const objectOne = {};
const objectTwo = new Object;
const objectThree = {};

objectThree.toString = function () { return "Bong" };

alert(objectOne); // [object Object]
alert(objectTwo); // [object Object]
alert(objectThree); // Bong
0 голосов
/ 18 июня 2020

alert не преобразует автоматически не примитивы в строки, для этого вам нужен метод toString(). Когда вы вызываете toString() на не примитиве, вы получаете возврат по умолчанию, который является его типом, и поскольку все в javascript по сути является объектом, возврат по умолчанию равен [Object object].

...