J: Основы JavaScript. Преобразование объектов в примитивы - видео HD
00:09:02
Обнаружено блокирование рекламы на сайте
Для существования нашего сайта необходим показ рекламы. Просим отнестись с пониманием и добавить сайт в список исключений вашей программы для блокировки рекламы (AdBlock и другие).
12n.ru 18496 роликов
574 просмотра на сайте 12n.ru
Основы JavaScript. Преобразование объектов в примитивы - видео.
В данном скринкасте мы разберем еще один вид преобразований: преобразование объектов в примитивы. Мы долго готовились к этой теме, рассматривая другие привидения типов, поэтому отнеситесь к ней более внимательно. Также мы затронем тему математических операций, которые станут основным объектом обсуждения в следующих видео.
развернуть свернуть
Symbol.toPrimitive
Начнём с универсального подхода – символа Symbol.toPrimitive: метод с таким названием (если есть) используется для всех преобразований:
obj[Symbol.toPrimitive] = function(hint) {
// должен вернуть примитивное значение
// hint равно чему-то одному из: «string», «number» или «default»
};
Для примера используем его в реализации объекта user:
let user = {
name: «John»,
money: 1000,
[Symbol.toPrimitive](hint) {
alert(`hint: ${hint}`);
return hint == «string»? `{name: "${this.name}"}`: this.money;
}
};
// демонстрация результатов преобразований:
alert(user); // hint: string -> {name: «John»}
alert(+user); // hint: number -> 1000
alert(user + 500); // hint: default -> 1500
Как мы видим из кода, user преобразовывается либо в информативную читаемую строку, либо в денежный счёт в зависимости от значения хинта. Единственный метод user[Symbol.toPrimitive] смог обработать все случаи преобразований.
Методы toString/valueOf
Методы toString и valueOf берут своё начало с древних времён. Они не символы, так как в то время символов ещё не существовало, а просто обычные методы объектов со строковыми именами. Они предоставляют «устаревший» способ реализации преобразований объектов.
Если нет метода Symbol.toPrimitive, движок JavaScript пытается найти эти методы и вызвать их следующим образом:
toString -> valueOf для хинта со значением «string».
valueOf -> toString – в ином случае.
Для примера, используем их в реализации всё того же объекта user. Воспроизведём его поведение комбинацией методов toString и valueOf:
let user = {
name: «John»,
money: 1000,
// для хинта равного «string»
toString() {
return `{name: "${this.name}"}`;
},
// для хинта равного «number» или «default»
valueOf() {
return this.money;
}
};
alert(user); // toString -> {name: «John»}
alert(+user); // valueOf -> 1000
alert(user + 500); // valueOf -> 1500
Как видим, получилось то же поведение, что и в предыдущем примере с Symbol.toPrimitive.
Довольно часто мы хотим описать одно «универсальное» преобразование объекта к примитиву для всех ситуаций. Для этого достаточно создать один toString:
let user = {
name: «John»,
toString() {
return this.name;
}
};
alert(user); // toString -> John
alert(user + 500); // toString -> John500