Spec-Zone.ru › JavaScript

Object.prototype.toString()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Метод toString() экземпляров Object возвращает строку, представляющую этот объект. Предполагается, что этот метод будет переопределен производными объектами для пользовательской логики приведения типов.

Попробуйте

const map = new Map();

console.log(map.toString());
// Expected output: "[object Map]"

Синтаксис

toString()

Параметры

По умолчанию toString() не принимает параметров. Однако объекты, которые наследуются от Object, могут переопределить его своими собственными реализациями, которые принимают параметры. Например, методы Number.prototype.toString() и BigInt.prototype.toString() принимают необязательный параметр radix.

Возвращаемое значение

Строка, представляющая объект.

Описание

JavaScript вызывает метод toString для преобразования объекта в примитивное значение. Вам редко требуется вызывать метод toString самостоятельно; JavaScript автоматически вызывает его, когда встречает объект там, где ожидается примитивное значение.

Этот метод вызывается в приоритете при строковом преобразовании, но числовое преобразование и примитивное преобразование вызывают valueOf() в приоритете. Однако, поскольку базовый метод valueOf() возвращает объект, метод toString() обычно вызывается в конце, если только объект не переопределяет valueOf(). Например, +[1] возвращает 1, потому что его метод toString() возвращает "1", который затем преобразуется в число.

Все объекты, которые наследуются от Object.prototype (то есть все, кроме объектов с null-прототипом), наследуют метод toString(). Когда вы создаете собственный объект, вы можете переопределить toString(), чтобы вызвать пользовательский метод, и таким образом ваш пользовательский объект может быть преобразован в строковое значение. В качестве альтернативы вы можете добавить метод [Symbol.toPrimitive](), который позволяет еще больше контролировать процесс преобразования и всегда будет предпочтительнее valueOf или toString для любого преобразования типов.

Чтобы использовать базовый Object.prototype.toString() с объектом, в котором он переопределен (или вызвать его на null или undefined), вам нужно вызвать Function.prototype.call() или Function.prototype.apply(), передав объект, который вы хотите проверить, в качестве первого параметра (называемого thisArg).

const arr = [1, 2, 3];

arr.toString(); // "1,2,3"
Object.prototype.toString.call(arr); // "[object Array]"

Object.prototype.toString() возвращает "[object Type]", где Type — это тип объекта. Если объект имеет свойство Symbol.toStringTag, значение которого является строкой, это значение будет использоваться как Type. Многие встроенные объекты, включая Map и Symbol, имеют Symbol.toStringTag. Некоторые объекты, предшествующие ES6, не имеют Symbol.toStringTag, но, тем не менее, имеют специальный тег. Они включают (тег совпадает с именем типа, указанным ниже):

  • Array
  • Function (любой объект, чей typeof возвращает "function")
  • Error
  • Boolean
  • Number
  • String
  • Date
  • RegExp

Объект arguments возвращает "[object Arguments]". Все остальное, включая пользовательские классы, если только они не имеют пользовательский Symbol.toStringTag, вернет "[object Object]".

Object.prototype.toString(), вызванный для null и undefined, возвращает [object Null] и [object Undefined] соответственно.

Примеры

Переопределение toString для пользовательских объектов

Вы можете создать функцию, которая будет вызываться вместо метода toString() по умолчанию. Созданная вами функция toString() должна возвращать строковое значение. Если она возвращает объект и метод вызывается неявно во время преобразования типов, то ее результат игнорируется, а вместо него используется значение связанного метода, valueOf(), или же выбрасывается TypeError, если ни один из этих методов не возвращает примитив.

Следующий код определяет класс Dog.

class Dog {
  constructor(name, breed, color, sex) {
    this.name = name;
    this.breed = breed;
    this.color = color;
    this.sex = sex;
  }
}

Если вы вызываете метод toString(), явно или неявно, на экземпляре Dog, он возвращает значение по умолчанию, унаследованное от Object:

const theDog = new Dog("Gabby", "Lab", "chocolate", "female");

theDog.toString(); // "[object Object]"
`${theDog}`; // "[object Object]"

Следующий код переопределяет метод toString() по умолчанию. Этот метод генерирует строку, содержащую name, breed, color и sex объекта.

class Dog {
  constructor(name, breed, color, sex) {
    this.name = name;
    this.breed = breed;
    this.color = color;
    this.sex = sex;
  }
  toString() {
    return `Dog ${this.name} is a ${this.sex} ${this.color} ${this.breed}`;
  }
}

При наличии этого кода всякий раз, когда экземпляр Dog используется в строковом контексте, JavaScript автоматически вызывает метод toString().

const theDog = new Dog("Gabby", "Lab", "chocolate", "female");

`${theDog}`; // "Dog Gabby is a female chocolate Lab"

Использование toString() для определения класса объекта

toString() может использоваться с любым объектом и (по умолчанию) позволяет получить его класс.

const toString = Object.prototype.toString;

toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Math has its Symbol.toStringTag
toString.call(Math); // [object Math]

toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]

Использование toString() таким образом ненадежно; объекты могут изменять поведение Object.prototype.toString(), определяя свойство Symbol.toStringTag, что приводит к неожиданным результатам. Например:

const myDate = new Date();
Object.prototype.toString.call(myDate); // [object Date]

myDate[Symbol.toStringTag] = "myDate";
Object.prototype.toString.call(myDate); // [object myDate]

Date.prototype[Symbol.toStringTag] = "prototype polluted";
Object.prototype.toString.call(new Date()); // [object prototype polluted]

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-object.prototype.tostring

Совместимость с браузерами

Десктоп Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
toString
1
12
1
3
1
18
4
10.1
1
1.0
1
1
1.0.0
1.0
0.10.0

Смотрите также

  • Полифил Object.prototype.toString с поддержкой Symbol.toStringTag в core-js
  • Object.prototype.valueOf()
  • Number.prototype.toString()
  • Symbol.toPrimitive
  • Symbol.toStringTag

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API