-
Notifications
You must be signed in to change notification settings - Fork 183
Fix methods-primitives #702
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
Andrii256
wants to merge
3
commits into
javascript-tutorial:master
Choose a base branch
from
Andrii256:01-05-01-primitives-methods
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+22
−22
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| # Методи примітивів | ||
|
|
||
| JavaScript дозволяє працювати з примітивами (рядок, число, тощо) так само як з об’єктами. Вони також надають методи для роботи. Ми вивчимо їх найближчим часом, але спочатку подивимось як воно працює, тому що примітиви не є об’єктами (і тут ми зробимо це ще більш зрозумілим). | ||
| JavaScript дозволяє працювати з примітивами (рядок, число, тощо) так, ніби вони об’єкти. Примітиви також забезпечені методами для роботи. Ми вивчимо їх найближчим часом, але спочатку подивимось як воно працює, бо все ж таки примітиви не є об’єктами (і тут ми краще це зрозуміємо). | ||
|
|
||
| Розгляньмо різницю між примітивами та об’єктами. | ||
|
|
||
|
|
@@ -14,7 +14,7 @@ JavaScript дозволяє працювати з примітивами (ряд | |
| - можна зберігати декілька значень як властивості. | ||
| - може бути створений за допомогою `{}`, наприклад: `{name: "Іван", age: 30}`. В JavaScript існують й інші об’єкти: функції — це теж об’єкти. | ||
|
|
||
| Одна з цікавих речей щодо об’єктів полягає в тому, що ми можемо зберігати функцію як одну з його властивостей. | ||
| Одна з найкращих особливостей об'єкта - це те, що ми можемо зберігати функцію як одну з його властивостей. | ||
|
|
||
| ```js run | ||
| let john = { | ||
|
|
@@ -29,28 +29,28 @@ john.sayHi(); // Привіт, друже! | |
|
|
||
| Отже, ми створили об’єкт `john` з методом `sayHi`. | ||
|
|
||
| Вже існує багато вбудованих об’єктів, які працюють з датами, помилками, елементами HTML і т.д. Вони мають різні властивості і методи. | ||
| Існує багато вбудованих об’єктів які працюють з датами, помилками, елементами HTML і т.д. Вони мають різні властивості і методи. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Кома перед словом які - потрібна |
||
|
|
||
| Але за все потрібно платити! | ||
|
|
||
| Об’єкти "важчі", ніж примітиви. Вони вимагають додаткових ресурсів для підтримки внутрішньої обробки. | ||
|
|
||
| ## Примітив як об’єкт | ||
|
|
||
| Маємо парадокс, з яким зустрічається автор JavaScript: | ||
| Маємо парадокс, з яким зустрівся автор JavaScript: | ||
|
|
||
| - Є багато речей, які можна було б зробити з примітивом-рядком або числом. Було б добре отримати доступ до цих методів. | ||
| - Є багато речей, які можна було б зробити з примітивом-рядком або числом. Було б дуже добре якби можна було викликати для примітивів відповідні методи. | ||
| - Примітиви повинні бути максимально швидкими та легкими. | ||
|
|
||
| Рішення виглядає трохи дивно, але так і є: | ||
| Рішення, яке він придумав, вийшло трохи незграбним. Та все ж. Ось як це працює в 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` з великими літерами. | ||
|
|
||
| Ось як він працює: | ||
|
|
||
|
|
@@ -62,13 +62,13 @@ alert( str.toUpperCase() ); // ПРИВІТ | |
|
|
||
| Не складно, так? Ось що саме трапляється в `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) - округлює число до заданої точності: | ||
|
|
||
|
|
@@ -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)`. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. На мою думку, краще замість "використовуючи їхній синтаксис" сказати "використовуючи для цього свій власний синтаксис" |
||
|
|
||
| У JavaScript це також можливо з історичних причин, але надзвичайно **не рекомендується**. Це призведе до непередбачуваних речей. | ||
|
|
||
|
|
@@ -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); | ||
|
|
@@ -104,7 +104,7 @@ if (zero) { // zero є true, тому що це об’єкт | |
| } | ||
| ``` | ||
|
|
||
| З іншого боку, використання тих же самих функцій `String/Number/Boolean` без `new` є абсолютно розумною і корисною річчю. Вони перетворюють значення у відповідний тип: рядок, число або булеве значення (примітиву). | ||
| З іншого боку, використання тих же самих функцій `String/Number/Boolean`, але без `new` попереду -- це абсолютно розумно і корисно. Без `new` ці функції перетворюють значення у відповідний тип: рядок, число або булеве значення (яке буде примітивом). | ||
|
|
||
| Наприклад, це цілком правильно: | ||
|
|
||
|
|
@@ -114,8 +114,8 @@ let num = Number("123"); // конвертує рядок в число | |
| ```` | ||
|
|
||
|
|
||
| ````warn header="null/undefined не мають методів" | ||
| Винятки становлять спеціальні примітиви `null` і `undefined`. Вони не мають відповідних "об’єктів обгорток" і не надають ніяких методів. Ми можемо назвати їх "найпримітивнішими". | ||
| ````warn header="null/undefined не мають методів" | ||
| Примітиви `null` і `undefined` є винятками. Вони не мають відповідних "об’єктів-обгорток" і не забезпечені ніякими методами. Ми можемо назвати їх "найбільш примітивними". | ||
|
|
||
| Спроба доступу до властивості такого значення дасть помилку: | ||
|
|
||
|
|
@@ -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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Краще залишити як було