Object.prototype.toString()

Метод toString() (до рядка) примірників Object повертає рядкове представлення свого об'єкта. Призначення цього методу — бути заміщеним в похідних об'єктах, для реалізації нетипової логіки зведення типів.

Спробуйте його в дії

Синтаксис

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. Багато вбудованих об'єктів мають свій Symbol.toStringTag, включно з Map і Symbol. Деякі об'єкти, що з'явилися до ES6, не мають свого Symbol.toStringTag, — проте все ж мають особливий позначник. До таких відносяться (позначник — такий само, як і ім'я типу, наведене нижче):

Об'єкт arguments повертає "[object Arguments]". Всі інші, включно з означеними користувачем класами, повертатимуть "[object Object]" (якщо не матимуть власного Symbol.toStringTag).

Закликання 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("Лапа", "лабрадор", "шоколадний", "дівчинка");

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 `Собака ${this.name} — це ${this.color} ${this.breed}-${this.sex}`;
  }
}

З урахуванням попереднього коду, кожного разу, коли примірник класу Dog вживається в рядковому контексті, JavaScript автоматично викличе метод toString().

const theDog = new Dog("Лапа", "лабрадор", "шоколадний", "дівчинка");

`${theDog}`; // "Собака Лапа — це шоколадний лабрадор-дівчинка"

Застосування методу toString() для виявлення класу об'єкта

Метод toString() можна використовувати з кожним об'єктом, і (усталено) це дає можливість отримувати його клас.

const toString = Object.prototype.toString;

toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Об'єкт Math має свій 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] = "забруднений прототип";
Object.prototype.toString.call(new Date()); // [object забруднений прототип]

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

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
toString()
Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 3
Opera Full support 3
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0

Дивіться також