HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: javascript, boolean, number, string, tostring, tolowercase, substr, ('x').tolowercase(), (new string('x')).tolowercase(), boxing</p>
1 <p>Теги: javascript, boolean, number, string, tostring, tolowercase, substr, ('x').tolowercase(), (new string('x')).tolowercase(), boxing</p>
2 <p>Прочитав эту заметку, вы никогда не захотите писать на JavaScript. Но подождите! В работе эти проблемы не всплывают почти никогда. Я специально для вас залезу в этот тёмный подвал JS, чтобы поведать о том, как работает (255).toString(16) и ('me: hello').substr(4) и откуда у примитивных типов<strong>number</strong>,<strong>string</strong>и<strong>boolean</strong>методы?</p>
2 <p>Прочитав эту заметку, вы никогда не захотите писать на JavaScript. Но подождите! В работе эти проблемы не всплывают почти никогда. Я специально для вас залезу в этот тёмный подвал JS, чтобы поведать о том, как работает (255).toString(16) и ('me: hello').substr(4) и откуда у примитивных типов<strong>number</strong>,<strong>string</strong>и<strong>boolean</strong>методы?</p>
3 <h2>Элегантный трюк JS</h2>
3 <h2>Элегантный трюк JS</h2>
4 <p>Как мы знаем, эти типы примитивные, то есть их значения - не объекты. Каждому "интересному" примитивному типу соответствует класс: Number, String и Boolean. Методы (<strong>toString</strong>,<strong>toLowerCase</strong>,<strong>substr</strong>) определены у этих типов-обёрток.</p>
4 <p>Как мы знаем, эти типы примитивные, то есть их значения - не объекты. Каждому "интересному" примитивному типу соответствует класс: Number, String и Boolean. Методы (<strong>toString</strong>,<strong>toLowerCase</strong>,<strong>substr</strong>) определены у этих типов-обёрток.</p>
5 <p>И каждый раз когда мы пытаемся получить свойство (или метод) примитивного значения, оно автоматически оборачивается в соответствующий объект, так что ('x').toLowerCase() превращается в (new String('x')).toLowerCase().</p>
5 <p>И каждый раз когда мы пытаемся получить свойство (или метод) примитивного значения, оно автоматически оборачивается в соответствующий объект, так что ('x').toLowerCase() превращается в (new String('x')).toLowerCase().</p>
6 <p>Такое оборачивание называется<strong>Boxing</strong>- положить в коробочку. После выполнения метода объект-обёртка просто выбрасывается.</p>
6 <p>Такое оборачивание называется<strong>Boxing</strong>- положить в коробочку. После выполнения метода объект-обёртка просто выбрасывается.</p>
7 <p>Объекты типа<strong>Number</strong>- настоящие объекты, со всеми вытекающими бонусами и проблемами: new Number(3) !== new Number(3), потому что теперь значения сравниваются по ссылке.</p>
7 <p>Объекты типа<strong>Number</strong>- настоящие объекты, со всеми вытекающими бонусами и проблемами: new Number(3) !== new Number(3), потому что теперь значения сравниваются по ссылке.</p>
8 <p>Никогда не используйте типы-обёртки с<strong>new</strong>как конструктор. Скорее всего, вы хотите именно значение примитивного типа: Number('3') === 3.</p>
8 <p>Никогда не используйте типы-обёртки с<strong>new</strong>как конструктор. Скорее всего, вы хотите именно значение примитивного типа: Number('3') === 3.</p>
9 <h2>Попрактикуемся?</h2>
9 <h2>Попрактикуемся?</h2>
10 <p>На собеседованиях мне несколько раз давали хитрую (но бесполезную) задачку. Что произойдет в результате выполнения этого кода:</p>
10 <p>На собеседованиях мне несколько раз давали хитрую (но бесполезную) задачку. Что произойдет в результате выполнения этого кода:</p>
11 const x = 10; x.hello = 'hello'; console.log(x.hello);<p>Если вы знаете про<strong>Boxing</strong>, то всё должно быть понятно - попробуйте! Пишите ответы и вопросы в комментариях!</p>
11 const x = 10; x.hello = 'hello'; console.log(x.hello);<p>Если вы знаете про<strong>Boxing</strong>, то всё должно быть понятно - попробуйте! Пишите ответы и вопросы в комментариях!</p>
12  
12