Разбор пытанняў з рэальных сумоўяў - JS Core. Boxing і unboxing.
Пытанне:
Адкуль метады ў прымітыўных тыпаў даных? Што такое boxing і unboxing?
Кароткі адказ
У прымітыўных тыпаў даных, акрамя null
і undefined
, ёсць метады, да якіх мы можам звярнуцца.
Метады возьмуцца з убудаванага прататыпа канструктара адпаведнага тыпу. Невідавочна ствараецца абгортка з канструктара, выкарыстоўваецца неабходны метад. Адразу пасля выкарыстоўвання абгортка выдаляецца.
Гэты працэс называецца адпаведна boxing і unboxing.
Падрабязны адказ
У прымітыўных тыпаў даных, акрамя null
і undefined
, ёсць метады, да якіх мы можам звярнуцца.
Напрыклад:
'hello'.toUpperCase();
Адкуль узяліся метады ў прымітыўных тыпаў даных?
Для кожнага прымітыўнага тыпу даных, акрамя null
і undefined
, існуе свой убудаваны канструктар, з якога і возьмуцца неабходныя метады.
Напрыклад, пры выкананні наступнага кода
const greeting = 'hello'.toUpperCase();
'hello'
абгорнецца "пад капотам" у
new String('hello').toUpperCase();
МетадtoUpperCase
возьмецца з прататыпа каструктараString
. Гэты працэс называецца boxing.
Такое абгортванне кода не азначае, што зараз наша прымітыўнае строкавае значэнне стала аб'ектам, бо адразу пасля выкарыстоўвання адбываецца адваротны працэсс распакоўкі аб'ектных тыпаў назад у прымітывы, які называецца unboxing.
const greeting = 'hello'.toUpperCase();
console.log(typeof greeting);
// string
Увесь гэты працэс мае назвуauto boxing
.
Калі нам патрэбна відавочна прывесці адзін тып даных да другога, можна выкарыстоўваць канструктар
патрэбнага тыпу, але без new
:
const number = Number("1"); console.log(typeof number); // number
Чаму непажадана відавочна выкарыстоўваць new Number("1")
?
const number = new Number("1"); console.log(number === 1); // false console.log(typeof number); // object
Відавочнае абгортванне значэння называецца manual autoboxing
.
Каментары
(Каб даслаць каментар залагуйцеся ў свой уліковы запіс)