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
, — проте все ж мають особливий позначник. До таких відносяться (позначник — такий само, як і ім'я типу, наведене нижче):
Array
Function
(будь-що, на що операторtypeof
повертає"function"
)Error
Boolean
Number
String
Date
RegExp
Об'єкт 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 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |