Разбор пытанняў з рэальных сумоўяў - 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:
text1const number = Number("1"); 2console.log(typeof number); 3// number 4
Чаму непажадана відавочна выкарыстоўваць new Number("1")?
text1const number = new Number("1"); 2 3console.log(number === 1); 4 5// false 6 7console.log(typeof number); 8 9// object 10 11
Відавочнае абгортванне значэння называецца manual autoboxing.
Каментары
(Каб даслаць каментар залагуйцеся ў свой уліковы запіс)