You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
JavaScript дозволяє працювати з примітивами (рядок, число, тощо) так само як зоб’єктами. Вони такожнадають методи для роботи. Ми вивчимо їх найближчим часом, але спочатку подивимось як воно працює,тому щопримітиви не є об’єктами (і тут мизробимо цеще більш зрозумілим).
JavaScript дозволяє працювати з примітивами (рядок, число, тощо) так, ніби вониоб’єкти. Примітиви такожзабезпечені методами для роботи. Ми вивчимо їх найближчим часом, але спочатку подивимось як воно працює,бо все ж такипримітиви не є об’єктами (і тут микраще цезрозуміємо).
Розгляньмо різницю між примітивами та об’єктами.
Expand All
@@ -14,7 +14,7 @@ JavaScript дозволяє працювати з примітивами (ряд
- можна зберігати декілька значень як властивості.
- може бути створений за допомогою `{}`, наприклад: `{name: "Іван", age: 30}`. В JavaScript існують й інші об’єкти: функції — це теж об’єкти.
Одна зцікавих речей щодо об’єктів полягає в тому, що ми можемо зберігати функцію як одну з його властивостей.
Одна знайкращих особливостей об'єкта - це те, що ми можемо зберігати функцію як одну з його властивостей.
Отже, ми створили об’єкт `john` з методом `sayHi`.
Вже існуєбагато вбудованих об’єктів, які працюють з датами, помилками, елементами HTML і т.д. Вони мають різні властивості і методи.
Існуєбагато вбудованих об’єктів які працюють з датами, помилками, елементами HTML і т.д. Вони мають різні властивості і методи.
Але за все потрібно платити!
Об’єкти "важчі", ніж примітиви. Вони вимагають додаткових ресурсів для підтримки внутрішньої обробки.
## Примітив як об’єкт
Маємо парадокс, з якимзустрічається автор #"6e1652f1a11484ded3d3ccb67efaa777666ed5ee6dc2535959902e15e413afd8">
Маємо парадокс, з якимзустрівся автор #"6e1652f1a11484ded3d3ccb67efaa777666ed5ee6dc2535959902e15e413afd8">
- Є багато речей, які можна було б зробити з примітивом-рядком або числом. Було б добреотримати доступ до цих методів.
- Є багато речей, які можна було б зробити з примітивом-рядком або числом. Було бдужедобреякби можна було викликати для примітивів відповідні методи.
- Примітиви повинні бути максимально швидкими та легкими.
Рішення виглядає трохи дивно, але так і є:
Рішення, яке він придумав, вийшло трохи незграбним. Та все ж. Ось як це працює в JavaScript:
1. Примітиви залишаються примітивами.Лише значення, якви і хотіли.
2. JavaScript дозволяє отримати доступ до методів та властивостей рядків, чисел, булеанів та символів.
3. Для цього створюється спеціальний "об’єктобгортка" з додатковою функціональністю, який потім знищується.
1. Примітиви залишаються примітивами.В них, які задумано, є лише одне значення.
2.АлеJavaScript дозволяє отримати доступ до методів та властивостей рядків, чисел, булеанів та символів.
3. Для цього створюється спеціальний "об’єкт-обгортка" (англ. object wrapper) з додатковою функціональністю, який потім знищується.
Для кожного примітиву створюється своя "обгортка": `String`, `Number`, `Boolean`, `Symbol` та `BigInt`.Отже, вони містять різні набори методів.
Для кожного примітиву створюється своя "обгортка": `String`, `Number`, `Boolean`, `Symbol` та `BigInt`.Ну й вони містять різні набори методів.
Наприклад: існує такий метод для рядка, як [str.toUpperCase()](https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase), який поверне рядок `str` з великими літерами.
Наприклад: існує такий метод для рядка, як [str.toUpperCase()](https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase), який поверне рядок `str` з великими літерами.
Не складно, так? Ось що саме трапляється в `str.toUpperCase()`:
1. Рядок `str` є примітивом. Томупід час зверненнядо його властивості створюється спеціальний об’єкт, який знає значення рядка і має корисні методи, такі як `toUpperCase()`.
2. Цей метод виконується і повертає новий рядок (що показує `alert`).
3. Спеціальний об’єктруйнується, залишаючилише примітив `str`.
1. Рядок `str` є примітивом. Томув момент, коли треба звернутисьдо його властивості, створюється спеціальний об’єкт, який знає значення рядка і має корисні методи, такі як `toUpperCase()`.
2. Цей метод виконується і повертає новий рядок (який передається в `alert`).
3. Спеціальний об’єктзнищується, і в пам'яті залишаєтьсялише сам примітив `str`.
Отже, примітиви можуть надавати методи, але залишаються "легкими".
Двигун JavaScript добре оптимізує цей процес. Він навіть може пропустити створення додаткового об’єкта взагалі. Алевін все ще повинен дотримуватися специфікації і вести себетак, наче вінїї створює.
Рушій JavaScript добре оптимізує цей процес. Він навіть можевзагаліпропустити створення додаткового об’єкта-обгортки. Аленавіть в таких ситуаціях він поводитьсятак, наче вінтой об'єкт-обгортку створив.
Число має свої методи, наприклад: [toFixed(n)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed) - округлює число до заданої точності:
Expand All
@@ -81,8 +81,8 @@ alert( n.toFixed(2) ); // 1.23
Ми переглянемо більш конкретні методи у розділах <info:number> та <info:string>.
````warn header="Конструктори `String/Number/Boolean` лише для внутрішнього використання"
Деякі мови як Java дозволяють явно створювати "об’єктобгортку" для примітивів, використовуючисинтаксис як `new Number(1)` або `new Boolean(false)`.
````warn header="Конструктори `String/Number/Boolean`існуютьлише для внутрішнього використання"
Деякі мови якотJava дозволяють явно створювати "об’єкт-обгортку" для примітивів, використовуючиїхній синтаксис `new Number(1)` або `new Boolean(false)`.
У JavaScript це також можливо з історичних причин, але надзвичайно **не рекомендується**. Це призведе до непередбачуваних речей.
Expand All
@@ -94,7 +94,7 @@ alert( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"!
```
Об’єкти завжди повертають `true` в `if`, отже ми побачимо `alert`:
В JavaScript об’єкти завжди повертають `true` в `if`, отже ми побачимо `alert`:
```js run
let zero = new Number(0);
Expand All
@@ -104,7 +104,7 @@ if (zero) { // zero є true, тому що це об’єкт
}
```
З іншого боку, використання тих же самих функцій `String/Number/Boolean`без `new`єабсолютнорозумною ікорисною річчю. Вониперетворюють значення у відповідний тип: рядок, число або булеве значення (примітиву).
З іншого боку, використання тих же самих функцій `String/Number/Boolean`, алебез `new`попереду -- цеабсолютнорозумно ікорисно. Без `new` ці функціїперетворюють значення у відповідний тип: рядок, число або булеве значення (яке буде примітивом).
Наприклад, це цілком правильно:
Expand All
@@ -114,8 +114,8 @@ let num = Number("123"); // конвертує рядок в число
````
````warn header="null/undefined не мають методів"
Винятки становлять спеціальні примітиви`null` і `undefined`. Вони не мають відповідних "об’єктівобгорток" і ненадають ніяких методів. Ми можемо назвати їх "найпримітивнішими".
````warn header="null/undefined не мають методів"
Примітиви`null` і `undefined` є винятками. Вони не мають відповідних "об’єктів-обгорток" і незабезпечені ніякими методами. Ми можемо назвати їх "найбільш примітивними".
Спроба доступу до властивості такого значення дасть помилку:
Expand All
@@ -125,5 +125,5 @@ alert(null.test); // помилка
## Підсумки
- Примітиви,крім `null` і `undefined`, дають багато корисних методів. Ми вивчимо їх у наступних розділах.
- Примітиви (крім `null` і `undefined`) забезпечені багатьма корисними методами. Ми вивчимо їх у наступних розділах.
- Формально, ці методи працюють через тимчасові об’єкти, але двигун JavaScript оптимізовано для швидкого виконання цих операцій, тому нам не треба хвилюватися.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.