From daa1a2aff136fa9da1fcc97d7da97a2036fabc77 Mon Sep 17 00:00:00 2001 From: Florian Merz Date: Thu, 11 Feb 2021 14:51:47 +0100 Subject: unslug uk: move --- .../equality_comparisons_and_sameness/index.html | 494 +++++++++++ .../guide/details_of_the_object_model/index.html | 760 +++++++++++++++++ .../guide/dokladno_pro_objectnu_model/index.html | 760 ----------------- .../guide/expressions_and_operators/index.html | 925 +++++++++++++++++++++ .../index.html" | 925 --------------------- .../javascript_technologies_overview/index.html | 87 ++ .../oglyad_tehnologiy_javascript/index.html | 87 -- .../reference/functions/arrow_functions/index.html | 362 ++++++++ .../reference/functions/rest_parameters/index.html | 211 +++++ .../index.html" | 211 ----- .../index.html" | 362 -------- .../global_objects/array/prototype/index.html | 185 ----- .../asyncfunction/prototype/index.html | 59 -- .../global_objects/boolean/prototype/index.html | 83 -- .../global_objects/error/prototype/index.html | 115 --- .../global_objects/evalerror/prototype/index.html | 90 -- .../global_objects/function/prototype/index.html | 100 --- .../generatorfunction/prototype/index.html | 66 -- .../internalerror/prototype/index.html | 63 -- .../reference/global_objects/math/round/index.html | 194 +++++ .../index.html" | 194 ----- .../global_objects/number/epsilon/index.html | 67 ++ .../reference/global_objects/number/index.html | 186 +++++ .../global_objects/number/isfinite/index.html | 86 ++ .../global_objects/number/isinteger/index.html | 94 +++ .../global_objects/number/isnan/index.html | 100 +++ .../global_objects/number/issafeinteger/index.html | 95 +++ .../number/max_safe_integer/index.html | 78 ++ .../global_objects/number/max_value/index.html | 64 ++ .../number/min_safe_integer/index.html | 62 ++ .../global_objects/number/min_value/index.html | 66 ++ .../reference/global_objects/number/nan/index.html | 59 ++ .../number/negative_infinity/index.html | 82 ++ .../global_objects/number/number/index.html | 63 ++ .../global_objects/number/parsefloat/index.html | 88 ++ .../global_objects/number/parseint/index.html | 83 ++ .../number/positive_infinity/index.html | 82 ++ .../global_objects/number/toexponential/index.html | 89 ++ .../global_objects/number/tofixed/index.html | 95 +++ .../number/tolocalestring/index.html | 154 ++++ .../global_objects/number/toprecision/index.html | 88 ++ .../global_objects/number/tosource/index.html | 54 ++ .../global_objects/number/tostring/index.html | 97 +++ .../global_objects/number/valueof/index.html | 67 ++ .../global_objects/promise/prototype/index.html | 70 -- .../global_objects/promise/reject/index.html | 73 ++ .../index.html" | 73 -- .../global_objects/rangeerror/prototype/index.html | 90 -- .../referenceerror/prototype/index.html | 91 -- .../syntaxerror/prototype/index.html | 89 -- .../global_objects/typeerror/prototype/index.html | 88 -- .../global_objects/urierror/prototype/index.html | 89 -- .../epsilon/index.html" | 67 -- .../index.html" | 186 ----- .../isfinite/index.html" | 86 -- .../isinteger/index.html" | 94 --- .../isnan/index.html" | 100 --- .../issafeinteger/index.html" | 95 --- .../max_safe_integer/index.html" | 78 -- .../max_value/index.html" | 64 -- .../min_safe_integer/index.html" | 62 -- .../min_value/index.html" | 66 -- .../nan/index.html" | 59 -- .../negative_infinity/index.html" | 82 -- .../number/index.html" | 63 -- .../parsefloat/index.html" | 88 -- .../parseint/index.html" | 83 -- .../positive_infinity/index.html" | 82 -- .../prototype/index.html" | 90 -- .../toexponential/index.html" | 89 -- .../tofixed/index.html" | 95 --- .../tolocalestring/index.html" | 154 ---- .../toprecision/index.html" | 88 -- .../tosource/index.html" | 54 -- .../tostring/index.html" | 97 --- .../valueof/index.html" | 67 -- .../reference/iteration_protocols/index.html | 352 ++++++++ .../operators/arithmetic_operators/index.html | 314 ------- .../operators/bitwise_operators/index.html | 560 ------------- .../operators/destructuring_assignment/index.html | 453 ++++++++++ .../operators/logical_operators/index.html | 253 ------ .../operators/object_initializer/index.html | 296 +++++++ .../index.html" | 453 ---------- .../index.html" | 283 ------- .../index.html" | 245 ------ .../index.html" | 419 ---------- .../index.html" | 296 ------- .../reference/statements/default/index.html | 118 --- .../index.html" | 352 -------- .../index.html" | 494 ----------- 90 files changed, 6206 insertions(+), 9766 deletions(-) create mode 100644 files/uk/web/javascript/equality_comparisons_and_sameness/index.html create mode 100644 files/uk/web/javascript/guide/details_of_the_object_model/index.html delete mode 100644 files/uk/web/javascript/guide/dokladno_pro_objectnu_model/index.html create mode 100644 files/uk/web/javascript/guide/expressions_and_operators/index.html delete mode 100644 "files/uk/web/javascript/guide/\320\262\320\270\321\200\320\260\320\267\320\270_\321\202\320\260_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270/index.html" create mode 100644 files/uk/web/javascript/javascript_technologies_overview/index.html delete mode 100644 files/uk/web/javascript/oglyad_tehnologiy_javascript/index.html create mode 100644 files/uk/web/javascript/reference/functions/arrow_functions/index.html create mode 100644 files/uk/web/javascript/reference/functions/rest_parameters/index.html delete mode 100644 "files/uk/web/javascript/reference/functions/\321\200\320\265\321\210\321\202\320\260_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\226\320\262/index.html" delete mode 100644 "files/uk/web/javascript/reference/functions/\321\201\321\202\321\200\321\226\320\273\320\272\320\276\320\262\321\226_\321\204\321\203\320\275\320\272\321\206\321\226\321\227/index.html" delete mode 100644 files/uk/web/javascript/reference/global_objects/array/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/asyncfunction/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/boolean/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/error/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/evalerror/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/function/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/generatorfunction/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/internalerror/prototype/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/math/round/index.html delete mode 100644 "files/uk/web/javascript/reference/global_objects/math/\320\267\320\260\320\276\320\272\321\200\321\203\320\263\320\265\320\273\320\275\320\275\321\217/index.html" create mode 100644 files/uk/web/javascript/reference/global_objects/number/epsilon/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/isfinite/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/isinteger/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/isnan/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/issafeinteger/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/max_safe_integer/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/max_value/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/min_safe_integer/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/min_value/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/nan/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/negative_infinity/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/number/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/parsefloat/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/parseint/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/positive_infinity/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/toexponential/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/tofixed/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/tolocalestring/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/toprecision/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/tosource/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/tostring/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/number/valueof/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/promise/prototype/index.html create mode 100644 files/uk/web/javascript/reference/global_objects/promise/reject/index.html delete mode 100644 "files/uk/web/javascript/reference/global_objects/promise/\320\262\321\226\320\264\321\205\320\270\320\273\320\265\320\275\320\276/index.html" delete mode 100644 files/uk/web/javascript/reference/global_objects/rangeerror/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/referenceerror/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/syntaxerror/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/typeerror/prototype/index.html delete mode 100644 files/uk/web/javascript/reference/global_objects/urierror/prototype/index.html delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/epsilon/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isfinite/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isinteger/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isnan/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/issafeinteger/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_safe_integer/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_value/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_safe_integer/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_value/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/nan/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/negative_infinity/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/number/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parsefloat/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parseint/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/positive_infinity/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/prototype/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toexponential/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tofixed/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tolocalestring/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toprecision/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tosource/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tostring/index.html" delete mode 100644 "files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/valueof/index.html" create mode 100644 files/uk/web/javascript/reference/iteration_protocols/index.html delete mode 100644 files/uk/web/javascript/reference/operators/arithmetic_operators/index.html delete mode 100644 files/uk/web/javascript/reference/operators/bitwise_operators/index.html create mode 100644 files/uk/web/javascript/reference/operators/destructuring_assignment/index.html delete mode 100644 files/uk/web/javascript/reference/operators/logical_operators/index.html create mode 100644 files/uk/web/javascript/reference/operators/object_initializer/index.html delete mode 100644 "files/uk/web/javascript/reference/operators/\320\264\320\265\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\270\320\267\320\260\321\206\321\226\321\217/index.html" delete mode 100644 "files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200_\321\200\320\276\320\267\320\277\320\260\320\272\321\203\320\262\320\260\320\275\320\275\321\217/index.html" delete mode 100644 "files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\320\276\321\200\321\226\320\262\320\275\321\217\320\275\320\275\321\217/index.html" delete mode 100644 "files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\321\200\320\270\321\201\320\262\320\276\321\224\320\275\320\275\321\217/index.html" delete mode 100644 "files/uk/web/javascript/reference/operators/\321\226\320\275\321\226\321\206\321\226\320\260\320\273\321\226\320\267\320\260\321\206\321\226\321\217_\320\276\320\261\342\200\231\321\224\320\272\321\202\321\226\320\262/index.html" delete mode 100644 files/uk/web/javascript/reference/statements/default/index.html delete mode 100644 "files/uk/web/javascript/reference/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270_\320\277\320\265\321\200\320\265\320\261\320\276\321\200\321\203/index.html" delete mode 100644 "files/uk/web/javascript/\320\277\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\275\320\260_\321\200\321\226\320\262\320\275\321\226\321\201\321\202\321\214_\321\202\320\260_\320\276\320\264\320\275\320\260\320\272\320\276\320\262\321\226\321\201\321\202\321\214/index.html" (limited to 'files/uk/web/javascript') diff --git a/files/uk/web/javascript/equality_comparisons_and_sameness/index.html b/files/uk/web/javascript/equality_comparisons_and_sameness/index.html new file mode 100644 index 0000000000..45d16489a1 --- /dev/null +++ b/files/uk/web/javascript/equality_comparisons_and_sameness/index.html @@ -0,0 +1,494 @@ +--- +title: Перевірка на рівність та однаковість +slug: Web/JavaScript/Перевірка_на_рівність_та_однаковість +tags: + - JavaScript + - NaN + - SameValue + - SameValueZero + - Однаковість + - Рівність + - Тотожність + - порівняння +translation_of: Web/JavaScript/Equality_comparisons_and_sameness +--- +
{{jsSidebar("Intermediate")}}
+ +

У ES2015 існує чотири алгоритми рівності:

+ + + +

JavaScript надає три різні операції порівняння значень:

+ + + +

Вибір оператора залежитиме від того, який різновид порівняння вам потрібен. Коротко:

+ + + +

Зауважте, що усі відмінності операторів стосуються їхнього поводження з простими величинами; жоден з них не порівнює, чи є параметри концептуально однаковими за структурою. Для будь-яких не примітивних об'єктів x та y, що мають однакову структуру, але є двома окремими об'єктами, всі вищенаведені форми порівняння вертатимуть false.

+ +

Строга рівність за допомогою ===

+ +

Строга рівність перевіряє рівність двох значень. До жодного з них не застосовується неявне приведення перед порівнянням. Якщо значення мають різні типи, вони вважаються нерівними. Якщо значення мають однаковий тип, не є числами, і мають однакові значення, вони вважаються рівними. Нарешті, якщо обидва значення є числами, вони вважаються рівними, якщо обидва не дорівнюють NaN та мають однакові значення, або якщо одне дорівнює +0, а інше -0.

+ +
var num = 0;
+var obj = new String('0');
+var str = '0';
+
+console.log(num === num); // true
+console.log(obj === obj); // true
+console.log(str === str); // true
+
+console.log(num === obj); // false
+console.log(num === str); // false
+console.log(obj === str); // false
+console.log(null === undefined); // false
+console.log(obj === null); // false
+console.log(obj === undefined); // false
+
+ +

Строга рівність майже завжди є доречною операцією порівняння. Для усіх значень, крім чисел, вона використовує очевидну семантику: значення дорівнює лише самому собі. Для чисел вона використовує трохи відмінну семантику, щоб згладити два граничні випадки. Перший полягає в тому, що нуль з рухомою комою є або додатним, або від'ємним. Це корисно для представлення деяких математичних рішень, але, оскільки у більшості ситуацій різниця між +0 та -0 не має значення, строга рівність вважає їх одним значенням. Другий випадок полягає в тому, що рухома кома містить концепцію не числа, NaN (not a number), для вирішення деяких нечітко визначених математичних проблем: наприклад, від'ємна нескінченність, додана до позитивної нескінченності. Строга рівність вважає значення NaN нерівним будь-якій іншій величині, в тому числі самому собі. (Єдиний випадок, у якому (x !== x) дорівнює true, це коли x дорівнює NaN.)

+ +

Нестрога рівність за допомогою ==

+ +

Нестрога рівність порівнює два значення після приведення обох значень до спільного типу. Після приведення (один чи обидва значення можуть зазнати перетворення), фінальне порівняння виконується так само, як його виконує оператор ===. Нестрога рівність є симетричною: вираз A == B за семантикою завжди ідентичний B == A для будь-яких значень A та B (за винятком порядку, в якому виконуються перетворення).

+ +

Порівняльна операція виконується наступним чином для операндів різних типів:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Операнд B
UndefinedNullNumberStringBooleanObject
Операнд AUndefinedtruetruefalsefalsefalsefalse
Nulltruetruefalsefalsefalsefalse
NumberfalsefalseA === BA === ToNumber(B)A === ToNumber(B)A == ToPrimitive(B)
StringfalsefalseToNumber(A) === BA === BToNumber(A) === ToNumber(B)A == ToPrimitive(B)
BooleanfalsefalseToNumber(A) === BToNumber(A) === ToNumber(B)A === BToNumber(A) == ToPrimitive(B)
ObjectfalsefalseToPrimitive(A) == BToPrimitive(A) == BToPrimitive(A) == ToNumber(B)A === B
+ +

У наведеній вище таблиці ToNumber(A) пробує перетворити свій аргумент на число перед порівнянням. Його поведінка еквівалентна операції +A (унарний оператор +). ToPrimitive(A) пробує перетворити свій аргумент-об'єкт на просту величину, викликаючи в різній послідовності методи A.toString та A.valueOf на операнді A.

+ +

Традиційно, та згідно з ECMAScript, усі об'єкти нестрого нерівні undefined та null. Але більшість переглядачів дозволяють дуже вузькому класу об'єктів (зокрема, об'єкту document.all на будь-якій сторінці) у певному контексті поводитись, як наче вони емулюють значення undefined. Нестрога рівність у такому контексті: null == A та undefined == A оцінить як true тільки за умови, що A є об'єктом, який емулює undefined. У всіх інших випадках об'єкт ніколи не є нестрого рівним undefined або null.

+ +
var num = 0;
+var obj = new String('0');
+var str = '0';
+
+console.log(num == num); // true
+console.log(obj == obj); // true
+console.log(str == str); // true
+
+console.log(num == obj); // true
+console.log(num == str); // true
+console.log(obj == str); // true
+console.log(null == undefined); // true
+
+// обидва дорівнюють false, крім виняткових випадків
+console.log(obj == null);
+console.log(obj == undefined);
+
+ +

Деякі розробники вважають, що краще ніколи не використовувати нестрогу рівність. Результат порівняння за допомогою строгої рівності легше передбачити, а, оскільки жодного приведення типів не виконується, обчислення може відбуватись швидше.

+ +

Порівняння за алгоритмом same-value

+ +

Порівняння same-value (однакове значення) спрямоване на останній випадок використання: визначення того, чи є два значення функціонально ідентичними в усіх контекстах. (Цей випадок використання демонструє приклад принципу підстановки Лісков.) Один приклад виникає, коли робиться спроба змінити незмінну властивість:

+ +
// Додати незмінну властивість NEGATIVE_ZERO у конструктор Number.
+Object.defineProperty(Number, 'NEGATIVE_ZERO',
+                      { value: -0, writable: false, configurable: false, enumerable: false });
+
+function attemptMutation(v) {
+  Object.defineProperty(Number, 'NEGATIVE_ZERO', { value: v });
+}
+
+ +

Object.defineProperty викине виняток, коли спроба змінити незмінну властивість дійсно змінить її, але нічого не зробить, якщо не робиться запитів на реальну зміну. Якщо v дорівнює -0, запитів на зміну не виконувалось, жодна помилка не буде викинута. Внутрішньо, коли перевизначається незмінна властивість, нове значення порівнюється з наявним значенням за допомогою алгоритму same-value.

+ +

Алгоритм same-value надається методом {{jsxref("Object.is")}}.

+ +

Порівняння за алгоритмом same-value-zero

+ +

Схожий на алгоритм same-value, але вважає +0 та -0 рівними.

+ +

Абстрактна рівність, строга рівність та однакове значення у специфікації

+ +

У ES5 порівняння, що виконується за допомогою ==, описане у Розділі 11.9.3, Алгоритм абстрактної рівності. Порівняння === у 11.9.6, Алгоритм строгої рівності. (Сходіть почитайте. Вони короткі та легкі для читання. Підказка: читайте спочатку алгоритм строгої рівності.) ES5 також описує, у Розділі 9.12, Алгоритм SameValue, для внутрішнього використання рушієм JS. Він значною мірою такий самий, як алгоритм строгої рівності, за винятком того, як 11.9.6.4 та 9.12.4 відрізняються у поводженні з {{jsxref("Number","числами")}}. ES2015 просто відкриває цей алгоритм через {{jsxref("Object.is")}}.

+ +

Щодо подвійного та потрійного дорівнює, можна побачити, що, за винятком попередньої перевірки типу у 11.9.6.1, алгоритм строгої рівності є підмножиною алгоритму абстрактної рівності, бо 11.9.6.2–7 відповідають 11.9.3.1.a–f.

+ +

Модель для розуміння порівняльних алгоритмів?

+ +

До ES2015 ви, можливо, сказали б щодо подвійного та потрійного дорівнює, що один є "посиленою" версією іншого. Наприклад, хтось може сказати, що подвійне дорівнює є посиленою версією потрійного дорвінює, тому що перше робить усе, що робить друге, але з приведенням типів у операндах. Наприклад, 6 == "6". (Альтернативно, хтось може сказати, що подвійне дорівнює є основою, а потрійне дорівнює є посиленою версією, тому що воно вимагає, щоб два операнди були однакового типу, і таким чином, вводить додаткове обмеження. Яка модель краща для розуміння, залежить від того, яким чином ви розглядаєте питання.)

+ +

Однак, така модель вбудованих операторів однаковості не може бути поширена на ES2015 з включенням у свій "діапазон" методу {{jsxref("Object.is")}}. Метод {{jsxref("Object.is")}} не просто "абстрактніший", ніж подвійне, або "суворіший", ніж потрійне дорівнює, він також не вписується десь посередині (тобто, будучи одночасно суворішим за подвійне дорівнює, але менш строгим за потрійне дорівнює). Як можна побачити з наведеної нижче порівняльної таблиці, все через поводження {{jsxref("Object.is")}} з {{jsxref("NaN")}}. Зверніть увагу, що, якби значення Object.is(NaN, NaN) дорівнювало false, ми могли б сказати, що метод вписується у абстрактно-суворий діапазон як ще суворіший за потрійне дорівнює, такий, що розрізняє -0 та +0. Однак, його поводження з {{jsxref("NaN")}} означає, що це не так. На жаль, {{jsxref("Object.is")}} просто має сприйматись з точки зору його особливих характеристик, а не його абстрактності чи суворості у порівнянні з операторами рівності.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Порівняльні алгоритми
xy=====Object.isSameValueZero
undefinedundefinedtruetruetruetrue
nullnulltruetruetruetrue
truetruetruetruetruetrue
falsefalsetruetruetruetrue
'foo''foo'truetruetruetrue
00truetruetruetrue
+0-0truetruefalsetrue
+00truetruetruetrue
-00truetruefalsetrue
0falsetruefalsefalsefalse
""falsetruefalsefalsefalse
""0truefalsefalsefalse
'0'0truefalsefalsefalse
'17'17truefalsefalsefalse
[1, 2]'1,2'truefalsefalsefalse
new String('foo')'foo'truefalsefalsefalse
nullundefinedtruefalsefalsefalse
nullfalsefalsefalsefalsefalse
undefinedfalsefalsefalsefalsefalse
{ foo: 'bar' }{ foo: 'bar' }falsefalsefalsefalse
new String('foo')new String('foo')falsefalsefalsefalse
0nullfalsefalsefalsefalse
0NaNfalsefalsefalsefalse
'foo'NaNfalsefalsefalsefalse
NaNNaNfalsefalsetruetrue
+ +

Коли використовувати {{jsxref("Object.is")}} та потрійне дорівнює

+ +

Загалом, єдиний випадок, коли особлива поведінка {{jsxref("Object.is")}} щодо нулів може становити інтерес, це впровадження певних схем метапрограмування, особливо тих, що стосуються дескрипторів властивостей, коли бажано, щоб ваша робота відображала певні характеристики {{jsxref("Object.defineProperty")}}. Якщо ваш випадок цього не вимагає, пропонується уникати {{jsxref("Object.is")}} та використовувати натомість ===. Навіть якщо у вашому випадку вимагається, щоб порівняння двох {{jsxref("NaN")}} повертало true, загалом, легше перевіряти {{jsxref("NaN")}} окремо (за допомогою методу {{jsxref("isNaN")}}, доступного у попередніх версіях ECMAScript), ніж розбиратися, як навколишні обчислення можуть вплинути на знаки нулів, які зустрінуться вам у порівняннях.

+ +

Ось невичерпний список вбудованих методів та операцій, що можуть спричинити відмінності між -0 та +0, які можуть проявити себе у коді:

+ +
+
- (унарний мінус)
+
+ +
+
+
let stoppingForce = obj.mass * -obj.velocity;
+ +

Якщо obj.velocity дорівнює 0 (або обчислюється як 0), в цьому місці отримуємо -0, який переходить далі у stoppingForce.

+
+
+ +
+
{{jsxref("Math.atan2")}}
+
{{jsxref("Math.ceil")}}
+
{{jsxref("Math.pow")}}
+
{{jsxref("Math.заокругелння","Math.round")}}
+
+ +
+
У деяких випадках -0 може потрапити у вираз як результат одного з цих методів, навіть коли жоден параметр не дорівнює -0. Наприклад, при використанні {{jsxref("Math.pow")}} для піднесення {{jsxref("Infinity", "-Infinity")}} до будь-якого від'ємного непарного степеня, отримуємо -0. Звертайтесь до документації щодо окремих методів.
+
+ +
+
{{jsxref("Math.floor")}}
+
{{jsxref("Math.max")}}
+
{{jsxref("Math.min")}}
+
{{jsxref("Math.sin")}}
+
{{jsxref("Math.sqrt")}}
+
{{jsxref("Math.tan")}}
+
+ +
+
Можливо отримати -0 як результат виконання даних методів у певних випадках, коли -0 присутній як один з параметрів. Наприклад, Math.min(-0, +0) повертає -0. Звертайтесь до документації щодо окремих методів.
+
+ +
+
~
+
<<
+
>>
+
Кожний з цих операторів внутрішньо використовує алгоритм ToInt32. Оскільки існує лише одне представлення 0 у внутрішньому 32-бітному цілочисельному типі, -0 не збережеться після подвійної операції інверсії. Наприклад, і Object.is(~~(-0), -0), і Object.is(-0 << 2 >> 2, -0) повернуть false.
+
+ +

Покладатися на метод {{jsxref("Object.is")}}, не беручи до уваги знаки нулів, може бути небезпечно. Звісно, якщо на меті стоїть розрізнити -0 та +0, він робить саме те, що потрібно.

+ +

Попередження: {{jsxref("Object.is")}} та NaN

+ +

Специфікація {{jsxref("Object.is")}} вважає усі екземпляри {{jsxref("NaN")}} тим самим об'єктом, але, оскільки нам доступні типізовані масиви, ми можемо мати окремі екземпляри, які не поводитимуться ідентично в усіх контекстах. Приклад:

+ +
var f2b = x => new Uint8Array(new Float64Array([x]).buffer);
+var b2f = x => new Float64Array(x.buffer)[0];
+var n = f2b(NaN);
+n[0] = 1;
+var nan2 = b2f(n);
+nan2
+> NaN
+Object.is(nan2, NaN)
+> true
+f2b(NaN)
+> Uint8Array(8) [0, 0, 0, 0, 0, 0, 248,127)
+f2b(nan2)
+> Uint8Array(8) [1, 0, 0, 0, 0, 0, 248,127)
+ +

Див. також

+ + diff --git a/files/uk/web/javascript/guide/details_of_the_object_model/index.html b/files/uk/web/javascript/guide/details_of_the_object_model/index.html new file mode 100644 index 0000000000..5e756710dd --- /dev/null +++ b/files/uk/web/javascript/guide/details_of_the_object_model/index.html @@ -0,0 +1,760 @@ +--- +title: Докладно про об'єктну модель +slug: Web/JavaScript/Guide/Dokladno_pro_Objectnu_Model +tags: + - Guide + - Intermediate + - JavaScript + - Object +translation_of: Web/JavaScript/Guide/Details_of_the_Object_Model +--- +
{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Working_with_Objects", "Web/JavaScript/Guide/Using_promises")}}
+ +

JavaScript - це об'єктна мова, що заснована на прототипах, а не на класах. У зв'язку з цим може бути менш очевидно, як саме JavaScript  дозволяє створювати ієрархії об'єктів із наслідуванням їх властивостей та значень. Цей розділ є спробою дещо прояснити цей механізм.

+ +

Вміст цього розділу розрахований на те, що ви вже, принаймні, дещо знайомі з мовою JavaScript, і застосовували його функції для створення простих об'єктів.

+ +

Мови з класовою та прототипною моделлю

+ +

Об'єктно-орієнтовані мови з класовою моделлю, такі як Java і C++, засновані на концепції двох окремих сутностей: класів та екземплярів.

+ + + +

Мови з прототипною моделлю наслідування, такі як JavaScript, не розділяють ці сутності: у них просто є об'єкти. Такі мови реалізовують поняття об'єкту-прототипу — об'єкту, що використовується як зразок, з якого вибираються початкові властивості для нового об'єкту. Будь-який об'єкт може вказати власні властивості, як в момент створення, так і під час виконання. Ну і на додачу, будь-який об'єкт можна задати в якості прототипу з іншого об'єкту — таким чином перший об'єкт розділить свої властивості з другим.

+ +

Задання і визначення класу

+ +

У мовах із класовою моделлю, класс задається у окремому визначенні класу. У цому визначенні можна вказати особливі методи, що називаються конструкторами, щоб створити екземпляри класу. Метод-конструктор може задати початкові значення властивостей екземпляру, і виконати якісь інші задачі прямо у момент створення. Для створення екземплярів застосовується оператор new у комбінації із методом-конструктором.

+ +

JavaScript слідує подібній моделі, проте не має відокремленого від конструктора визначення класу. Натомість, ви одразу задаєте функцію-конструктор, щоб створити об'єкти із відповідним початковим набором властивостей та значень. Будь-яка JavaScript-функція може використовуватись як конструктор. Для створення нового об'єкту так само використовується оператор new із фукнцією-конструктором.

+ +

 

+ +
+

Зауважте, що ECMAScript 2015 вводить визначення класу:

+ +
+

Класи JavaScript, введені стандартом ECMAScript 2015, є лише синтаксичним цукром поверх уже наявного у JavaScript прототипного наслідування. Тобто ці класи не вводять у JavaScript нової моделі наслідуваня.

+
+
+ +

 

+ +

Дочірні класи і наслідування

+ +

У мові з класовою моделлю наслідкування ієрархія класів створюється через визначення класу. У цьому визначенні можна окремо вказати, що новий клас являється дочірнім стосовно уже наявного класу. Дочірній клас отримає всі властивості батьківського і може привнести нові (або ж змінити успадковані). Наприклад, припустимо, що клас Employee включає в себе лише поля name та dept, і Manager - це дочірній клас Employee, що додає властивість reports. У цьому випадку, екземпляр класу Manager матиме три властивості: name, dept, та reports.

+ +

JavaScript реалізовує наслідування дещо інакше. Він дозволяє пов'язувати об'єкт-прототип із будь-якою фукнцією-конструктором. Тобто ви можете точнісінько реалізувати приклад EmployeeManager, проте використовуючи дещо інші терміни. Спершу ви визначаєте конструктор Employee, задаючи властивості name та dept. Далі ви визначаєте фукнцію-конструктор Manager, що викликає конструктор Employee та задає властивість reports. Насамкінець, призначаєте новий об'єкт, отриманий з Employee.prototype в якості прототипу конструктора Manager. Надалі, при створенні екземпляра Manager він наслідує властивості name і dept з об'єкту Employee.

+ +

Додавання і видалення властивостей

+ +

Зазвичай у мовах із класовою моделлю наслідування класи створюються під час компіляції, а екземпляри класів - під час компіляції чи виконання програми. Після того, як його було визначено, не можна змінити кількість або тип його властивостей. Однак, у JavaScript можна додавати чи видаляти властивості будь-якого об'єкту безпосередньо під час виконання програми. Якщо додати нову властивість до об'єкту-прототипу певного набору об'єктів, вони всі також отримають цю властивість.

+ +

Підсумок відмінностей класової і прототипної моделей

+ +

Наступна таблиця надає короткий підсумок цих відмінностей. Решта розділу розкриває деталі застосування JavaScript-конструкторів і прототипів для створення ієрархії об'єктів, та порівнює це із тим, як би це робилось у Java.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Порівняння мови із класовою моделлю наслідування (Java) і прототипною (JavaScript)
Класова модель (Java)Прототипна модель (JavaScript)
Клас та його екземпляр - окремі сутності.Всі об'єкти можуть наслідувати інші об'єкти.
Визначення класу описує його; екземпляри створюються методами-конструкторами.Функції-конструктори і описують, і створюють набори об'єктів.
Окремий об'єкт створюється оператором new.Так само.
Ієрархія об'єктів формується при визначенні класів, шляхом задання нащадків для уже наявних класів.Ієрархія об'єктів формується шляхом призначення об'єкту прототипом функції-конструктора.
Властивості наслідуються згідно ланцюжка класів.Властивості наслідуються згідно ланцюжка прототипів.
Визначення класу задає всі властивості всіх екземплярів класу. Неможливо динамічно додавати властивості під час виконання програми.Функція-конструктор чи прототип задають лише початковий набір властивостей. Можна додавати чи видаляти властивості як окремого об'єкту, так певного їх набору.
+ +

Приклад із робітником "Employee"

+ +

Надалі у розділі ієрархія робітників, що показана на наступному зображенні.

+ +
+
+

Проста ієрархія об'єктів, сформована із наступних елементів:

+ +

+
+ +
+
    +
  • Employee має поля name (із порожнім рядком в якості значення за замовчуванням) та dept (у якого значення за замовчуванням — "general").
  • +
  • Manager заснований на Employee. Він додає властивість reports  (за замовчуванням містить порожній масив для об'єктів Employee).
  • +
  • WorkerBee також заснований на Employee. Він додає властивість projects (за замовчуванням містить порожній масив, призначений для рядків).
  • +
  • SalesPerson заснований на WorkerBee. Він додає властивість quota (за замовчуванням — число 100). Він також перевизначае властивість dept, надаючи їй нове значенням "sales" (що означає, що всі SalesPerson відносяться до одного відділу).
  • +
  • Engineer заснований на WorkerBee. Він додає властивість machine (значення за замовчуванням — порожній рядок) і перевизначає властивість dept, задаючи їй значення "engineering".
  • +
+
+
+ +

Створення ієрархії

+ +

Існує декілька способів задати відповідні функції-конструктори, щоб реалізувати ієрархію робітників. Який спосіб обрати — значною мірою залежить від того, які можливості ви хочете отримати від вашого додатку.

+ +

Цей розділ показує, як використовувати дуже прості (і відносно негнучкі) визначення, і таким чином демонструє, як отримати робочий механізм наслідування. У цих визначеннях не можна задати жодного значення при створенні об'єкту — він отримає властивості із значеннями за замовчуванням, які можна буде змінити пізніше.

+ +

У реальному додатку ви б, ймовірно, визначали конструктор, що дозволяє задавати значення в момент створення об'єкту (докладніше у Більш гнучкі конструктори). А наразі ці прості визначення покажуть, як загалом відбувається наслідування.

+ +

Наступні визначення Employee у Java та JavaScript ідентичні. Єдина відмінність — у Java необхідно явно вказувати тип кожної властивості, на відміну від JavaScript (так як Java — мова із сильною типізацією, а JavaScript — із слабкою).

+ +
+

JavaScript

+ +
function Employee() {
+  this.name = '';
+  this.dept = 'general';
+}
+
+ +


+ Java

+ +
public class Employee {
+   public String name = "";
+   public String dept = "general";
+}
+
+
+ +

Визначення Manager і WorkerBee показують різницю у заданні батьківського об'єкту. У JavaScript ви додаєте екземпляр прототипу в якості значення поля prototype функції-конструктора, а потім перевизначаєте prototype.constructor, щоб це поле вказувало на функцію-конструктор. Ви можете це зробити в будь-якому місці після визначення конструктора. У Java надклас задається всередині визначення класу, і його ніяк не можна змінити зовні визначення класу.

+ +
+

JavaScript

+ +
function Manager() {
+  Employee.call(this);
+  this.reports = [];
+}
+Manager.prototype =
+    Object.create(Employee.prototype);
+Manager.prototype.constructor = Manager;
+
+function WorkerBee() {
+  Employee.call(this);
+  this.projects = [];
+}
+WorkerBee.prototype =
+    Object.create(Employee.prototype);
+WorkerBee.prototype.constructor = WorkerBee;
+
+ +


+ Java

+ +
public class Manager extends Employee {
+   public Employee[] reports =
+       new Employee[0];
+}
+
+
+
+public class WorkerBee extends Employee {
+   public String[] projects = new String[0];
+}
+
+
+
+
+ +

 

+ +

Визначення Engineer та SalesPerson створюють об'єкти, що наслідуються вже від WorkerBee, а, отже, і від Employee. Об'єкти цих типів мають властивості всіх об'єктів вище у ланцюжку наслідування. Надодачу, ці визначення перевизначають успадковані значення поля dept, змінюючи їх відповідно до нового типу.

+ +
+

JavaScript

+ +
function SalesPerson() {
+   WorkerBee.call(this);
+   this.dept = 'sales';
+   this.quota = 100;
+}
+SalesPerson.prototype =
+    Object.create(WorkerBee.prototype);
+SalesPerson.prototype.constructor = SalesPerson;
+
+function Engineer() {
+   WorkerBee.call(this);
+   this.dept = 'engineering';
+   this.machine = '';
+}
+Engineer.prototype =
+    Object.create(WorkerBee.prototype);
+Engineer.prototype.constructor = Engineer;
+
+ +


+ Java

+ +
public class SalesPerson extends WorkerBee {
+   public String dept = "sales";
+   public double quota = 100.0;
+}
+
+
+public class Engineer extends WorkerBee {
+   public String dept = "engineering";
+   public String machine = "";
+}
+
+
+
+ +

Таким чином, ви можете створювати екземпляри об'єктів із уже заданими значеннями для своїх властивостей. Наступна схема ілюструє застосування цих JavaScript-визначень для створення нових об'єктів, і демонструє значення їх властивостей.

+ +
+

Зауважте, що: термін екземпляр має специфічний технічний зміст у мовах із класовою моделлю. У цих мовах екземпляр являється окремою реалізацією класу і корінним чином відрізняється від його визначення. У JavaScript, "екземпляр" не має такого особливого змісту, бо сам JavaScript не має такої значної відмінності класів від їх реалізацій. Однак, у контексті JavaScript, "екземпляр" може неформально позначати об'єкт, створений певною функцією-конструктором. Тому, згідно наступного прикладу, можна неформально стверджувати, що jane є екземпляром класу Engineer. Так само, хоча терміни предок, нащадок, дочірній і батьківський класи не мають формального смісту в JavaScript, їх можна застосовувати для позначення об'єктів, що знаходяться вище чи нижче у ланцюжку прототипів.

+
+ +

Створення об'єктів за допомогою простих визначень

+ +
+

Ієрархія об'єктів

+ +

Наступна ієрархія створена за допомогою коду у правій частині.

+ +

+ +

Окремі об'єкти = Jim, Sally, Mark, Fred, Jane, etc.
+ "Екземпляри", створені конструктором

+ +
var jim = new Employee;
+// Дужки можна опустити, якщо
+// конструктор не приймає аргументів.
+// jim.name має значення ''
+// jim.dept має значення 'general'
+
+var sally = new Manager;
+// sally.name має значення ''
+// sally.dept має значення 'general'
+// sally.reports має значення []
+
+var mark = new WorkerBee;
+// mark.name має значення ''
+// mark.dept має значення 'general'
+// mark.projects має значення []
+
+var fred = new SalesPerson;
+// fred.name має значення ''
+// fred.dept має значення 'sales'
+// fred.projects має значення []
+// fred.quota має значення 100
+
+var jane = new Engineer;
+// jane.name має значення ''
+// jane.dept має значення 'engineering'
+// jane.projects має значення []
+// jane.machine має значення ''
+
+
+ +

Властивості (поля) об'єкту

+ +

Ця секція описує, як об'єкти наслідують властивості інших об'єктів у ланцюжку прототипів, і що відбувається, якщо додати властивість під час виконання програми.

+ +

Наслідування властивостей

+ +

Припустимо, такою інструкцією ви створили екземпляр WorkerBee — об'єкт mark:

+ +
var mark = new WorkerBee;
+
+ +

Коли JavaScript бачить оператор new, він створює загальний об'єкт і неявно встановлює WorkerBee.prototype значенням внутрішньої властивості [[Prototype]], і передає цей новий об'єкт як значення this до фукнції-конструктора WorkerBee. Внутрішня властивість [[Prototype]] визначає ланцюжок прототипів для виводу значень полів. Коли ці властивості задані, JavaScript повертає новий об'єкт, а інструкція присвоєння задає його в якості значення змінної mark.

+ +

Описаний процес явно не встановлює значення об'єкту mark для властивостей (локальні значення), які mark наслідує з ланцюжка прототипів. Коли ви запитуєте значення властивості, JavaScript в першу чергу перевіряє наявність цього значення у об'єкті, і повертає його, якщо знаходить. Якщо ж ні, JavaScript перевіряє весь ланцюжок прототипів (за допомогою властивості [[Prototype]]). Якщо об'єкт у ланцюжку має таку властивість - буде повернуто її значення (або повідомлення, що об'єкт не має такої властивості, якщо її все-таки не було знайдено). Таким чином, об'єкт mark має наступні властивості і значення:

+ +
mark.name = '';
+mark.dept = 'general';
+mark.projects = [];
+
+ +

З конструктора Employee об'єкту mark призначено локальні значення для властивостей name та dept, а з конструктора WorkerBee — значення властивості projects. Таким чином ми отримуємо наслідування властивостей і їх значень у JavaScript. Деякі тонкощі цього процесу додатково висвітлені у Іще раз про наслідування властивостей.

+ +

Так як ці конструктори не дозволяють задати специфічні для екземпляру значення, це являється загальним прикладом. В якості значень властивостей взяті значення за замовчуванням, що розповсюджуються на всі об'єкти, створені на основі WorkerBee. Звісно, значення цих властивостей можна змінити. Наприклад, так можна встановити їх значення для об'єкту mark:

+ +
mark.name = 'Doe, Mark';
+mark.dept = 'admin';
+mark.projects = ['navigator'];
+ +

Додавання властивостей

+ +

У JavaScript, можна додавати властивості до об'єкту безпосередно під час виконання. Ви не обмежені застосуванням лише властивостей, наданих конструктором. Щоб додати нову властивість до окремого об'єкту, просто призначте йому нове значення, як наведено далі:

+ +
mark.bonus = 3000;
+
+ +

Тепер об'єкт mark містить властивість bonus, проте більше ніхто із WorkerBee її не має.

+ +

Якщо додати нову властивість до об'єкту-прототипу іншого конструктора, то ця властивість з'явиться у всіх об'єктів, що наслідують властивості від прототипу. Наприклад, ось так можна додати властивість specialty всім робітникам:

+ +
Employee.prototype.specialty = 'none';
+
+ +

Як тільки JavaScript виконає інструкцію, об'єкт mark матиме властивість specialty із значенням "none". Наступна схема ілюструє ефект від додавання цієї властивості до прототипу Employee і її перевизначення у прототипі Engineer.

+ +


+ Додавання властивостей

+ +

Більш гнучкі конструктори

+ +

Наведені раніше функції-конструктори не дозволяють задавати значення під час створенні екземпляру. Як і у Java, можна надати конструктору аргументи для ініціалізації значень властивостей у об'єктів. Наступна схема показує один із способів це зробити.

+ +


+ Задання властивостей у конструкторі, варіант 1

+ +

Таблиця далі показує визначення цих об'єктів у Java і JavaScript.

+ +
+

JavaScript

+ +

Java

+
+ +
+
function Employee(name, dept) {
+  this.name = name || '';
+  this.dept = dept || 'general';
+}
+
+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
public class Employee {
+   public String name;
+   public String dept;
+   public Employee () {
+      this("", "general");
+   }
+   public Employee (String name) {
+      this(name, "general");
+   }
+   public Employee (String name, String dept) {
+      this.name = name;
+      this.dept = dept;
+   }
+}
+
+
+ +
+
function WorkerBee(projs) {
+
+ this.projects = projs || [];
+}
+WorkerBee.prototype = new Employee;
+
+ +

 

+ +

 

+ +

 

+ +
public class WorkerBee extends Employee {
+   public String[] projects;
+   public WorkerBee () {
+      this(new String[0]);
+   }
+   public WorkerBee (String[] projs) {
+      projects = projs;
+   }
+}
+
+
+ +
+
+function Engineer(mach) {
+   this.dept = 'engineering';
+   this.machine = mach || '';
+}
+Engineer.prototype = new WorkerBee;
+
+ +

 

+ +

 

+ +

 

+ +
public class Engineer extends WorkerBee {
+   public String machine;
+   public Engineer () {
+      dept = "engineering";
+      machine = "";
+   }
+   public Engineer (String mach) {
+      dept = "engineering";
+      machine = mach;
+   }
+}
+
+
+ +

Ці JavaScript-визначення застосовують особливу ідіому для задання значення за замовчуванням:

+ +
this.name = name || '';
+
+ +

Логічний оператор АБО у JavaScript (||) обчислює перше значення. Якщо результат можна привести до true, оператор повертає його, а інакше - значення другого аргументу. Таким чином, ця стрічка коду перевіряє, чи name має якесь корисне значення для властивості name. Якщо так — this.name отримує її значення, а інакше значенням this.name стає порожній рядок. У розділі ця ідіома застосовується для стислості; однак вона може бути неочевидною на перший погляд.

+ +
+

Зауважте, що: це може працювати не так, як очікується, якщо конструктор викликається із аргументами, що приводяться до false (число 0 і порожній рядок (""). У цьому випадку буде обрано значення за замовчуванням.

+
+ +

Таким чином можливо задати значення для властивостей на місці, безпосередньо під час створення екземпляру об'єкту. Наступною інструкцією ви можете створити новий екземпляр Engineer:

+ +
var jane = new Engineer('belau');
+
+ +

Властивості Jane тепер виглядають так:

+ +
jane.name == '';
+jane.dept == 'engineering';
+jane.projects == [];
+jane.machine == 'belau';
+
+ +

Зауважте, що таким визначенням ви не можете задати первинне значення для наслідуваного поля name. Для задання значення наслідуваним властивостям у JavaScript, необхідно додати трохи більше коду до фукнції-конструктора.

+ +

Поки що фукнція-конструктор створила загальний об'єкт, задала на місці властивості і значення нового об'єкту. Можна зробити, щоб конструктор додавав властивості безпосередньо викликаючи конструктор об'єкта, вищого у ієрархії прототипів. Власне, як зображено у наступній схемі.

+ +


+ Задання властивостей у конструкторі, варіант 2

+ +

Розгляньмо детальніше одне із цих визначень. Ось новий конструктор Engineer:

+ +
function Engineer(name, projs, mach) {
+  this.base = WorkerBee;
+  this.base(name, 'engineering', projs);
+  this.machine = mach || '';
+}
+
+ +

Припустимо, ви ось так створюєте новий об'єкт Engineer:

+ +
var jane = new Engineer('Doe, Jane', ['navigator', 'javascript'], 'belau');
+
+ +

Тут JavaScript виконує наступні кроки:

+ +
    +
  1. Оператор new створює загальний об'єкт і задає Engineer.prototype значенням його властивості __proto__ .
  2. +
  3. Оператор new передає новий об'єкт у конструктор Engineer в якості значення this.
  4. +
  5. Конструктор створює нову властивість base для цього об'єкту і присвоює їй значення конструктора WorkerBee. Так конструктор WorkerBee стає методом об'єкту Engineer. Назва властивості base не є чимось особливим. Ви можете використати будь-яке дозволене ім'я властивості, а base просто звучить змістовно для даного випадку.
  6. +
  7. Конструктор викликає метод base, передаючи в нього два своїх аргументи ("Doe, Jane" і ["navigator", "javascript"]) і новий рядок "engineering". Явно вказаний "engineering" у конструкторі означає, що всі об'єкти Engineer матимуть одне значення для наслідуваної властивості dept, і це значення заміщує успадковане від Employee.
  8. +
  9. Так як метод base належить Engineer, всередині виклику base JavaScript прив'язує значення this до об'єкту, створеного на першому етапі. Таким чином функція WorkerBee, в свою чергу, передає аргументи "Doe, Jane" та "engineering" до конструктора Employee. Після повернення з конструктора Employee функція WorkerBee задає останнім аргументом поле projects.
  10. +
  11. Після повернення з методу base конструктор Engineer ініціалізовує властивість machine об'єкту значенням "belau".
  12. +
  13. Після повернення з конструктору JavaScript присвоює новий об'єкт змінній jane.
  14. +
+ +

Може скластися враження, що, викликавши конструтктор WorkerBee зсередини конструктора Engineer, ви вкажете наслідування відповідно для об'єктів Engineer. Насправді виклик конструктора WorkerBee гарантує, що об'єкт Engineer матиме всі властивості, вказані у всіх викликаних конструкторах. Однак, якщо пізніше додати нові властивості до прототипів Employee чи WorkerBee, вони не будуть успадковані об'єктом Engineer. Припустимо, у нас є наступні інструкції:

+ +
function Engineer(name, projs, mach) {
+  this.base = WorkerBee;
+  this.base(name, 'engineering', projs);
+  this.machine = mach || '';
+}
+var jane = new Engineer('Doe, Jane', ['navigator', 'javascript'], 'belau');
+Employee.prototype.specialty = 'none';
+
+ +

Об'єкт jane не наслідує властивість specialty. Вам все ще необхідно явно вказувати прототип для гарантії динамічного наслідування. Натомість розглянемо такий набір інструкцій:

+ +
function Engineer(name, projs, mach) {
+  this.base = WorkerBee;
+  this.base(name, 'engineering', projs);
+  this.machine = mach || '';
+}
+Engineer.prototype = new WorkerBee;
+var jane = new Engineer('Doe, Jane', ['navigator', 'javascript'], 'belau');
+Employee.prototype.specialty = 'none';
+
+ +

Тепер значенням властивості specialty об'єкту jane являється "none".

+ +

Іншим способом наслідування являється використання методів call() чи apply(). Ось дві еквівалентні ділянки коду:

+ +
+
function Engineer(name, projs, mach) {
+  this.base = WorkerBee;
+  this.base(name, 'engineering', projs);
+  this.machine = mach || '';
+}
+
+ +
function Engineer(name, projs, mach) {
+  WorkerBee.call(this, name, 'engineering', projs);
+  this.machine = mach || '';
+}
+
+
+ +

Використання методу call() дає більш чисту реалізацію, так як base більше не потрібен.

+ +

Іще раз про наслідування властивостей

+ +

У попередніх частинах було описано, як конструктори і прототипи JavaScript дозволяють реалізовувати ієрархію та наслідування. Ця частина розглядає деякі тонкощі, які, можливо, не були очевидними у наведеному вище тексті.

+ +

Локальні і успадковані змінні

+ +

Коли ви викликаєте властивість, JavaScript виконує наступні кроки (як описано вище у главі):

+ +
    +
  1. Перевіряє наявність цієї змінної прямо в об'єкті, і повертає її значення, якщо знаходить.
  2. +
  3. Якщо її немає серед локальних змінних - перевіряє ланцюжок прототипів (використовуючи властивість __proto__).
  4. +
  5. Якщо прототип у ланцюжку має значення вказаної властивості — повертає це значення.
  6. +
  7. Якщо вказана властивість не знайдена — значить, об'єкт її не має.
  8. +
+ +

Результат виконання цих кроків залежить від того, як ви задаєте значення і об'єкти.  Перший приклад мав такі визначення:

+ +
function Employee() {
+  this.name = '';
+  this.dept = 'general';
+}
+
+function WorkerBee() {
+  this.projects = [];
+}
+WorkerBee.prototype = new Employee;
+
+ +

Припустимо, враховуючи ці визначення, що наступною інструкцією ви створили екземпляр WorkerBee у змінній amy:

+ +
var amy = new WorkerBee;
+
+ +

Об'єкт amy має одну локальну змінну — projects. Значення властивостей name та dept насправді не належать amy, і тому виводяться через поле її поле __proto__. Отже, amy має такі значення властивостей:

+ +
amy.name == '';
+amy.dept == 'general';
+amy.projects == [];
+
+ +

Тепер припустимо, що ви змінили значення властивості name у прототипі, асоційованому з Employee:

+ +
Employee.prototype.name = 'Unknown';
+
+ +

На перший погляд, можна очікувати, що нове значення пошириться на всі екземпляри Employee. Однак, це не так.

+ +

При створенні будь-якого екземпляру об'єкту Employee, цей екземпляр отримає локальне значення для властивості name (порожній рядок). Тобто, коли ми задаємо прототип WorkerBee шляхом створення нового об'єкту Employee, WorkerBee.prototype має локальне значення властивості name. Отже, коли JavaScript шукає властивість name об'єкту amy (екземпляр WorkerBee), він знаходить місцеве значення властивості у WorkerBee.prototype. І тому він не намагається шукати далі в ланцюжку прототипів до Employee.prototype.

+ +

Якщо ви хочете змінити значення властивості під час виконання, та ще й так, щоб воно поширилось на всіх нащадків  об'єкту, слід визначати це значення не у конструкторі об'єкту, а у прототипі конструктора. Припустимо, наприклад, що ви змінили попередній варіант реалізації на такий:

+ +
function Employee() {
+  this.dept = 'general';    // Зауважте, що тут немає this.name (локальної змінної)
+}
+Employee.prototype.name = '';    // Одна копія
+
+function WorkerBee() {
+  this.projects = [];
+}
+WorkerBee.prototype = new Employee;
+
+var amy = new WorkerBee;
+
+Employee.prototype.name = 'Unknown';
+
+ +

У цьому випадку, властивість amy name стане "Unknown".

+ +

Як ілюструють ці приклади, якщо вам потрібно і мати значення за замовчуванням для властивостей об'єктів, і можливість змінювати ці значення за замовчуванням під час виконання, слід задавати властивості у прототипі конструктора, а не у самому конструкторі.

+ +

Визначення відносин екземпляру

+ +

Пошук властивості у JavaScript виконується серед власних властивостей об'єкту, і, якщо властивість з даним іменем не була знайдена, пошук переходить всередину особливої властивості __proto__. Це відбувається рекурсивно, і цей процес називається "пошук у ланцюжку прототипів".

+ +

Властивість __proto__ встановлюється у момент конструювання об'єкту; вказує вона на властивість prototype конструктора. Тобто вираз new Foo() створює об'єкт із__proto__ == Foo.prototype. Відповідно, зміни у Foo.prototype впливають на пошук властивості всіх об'єктів, створених через new Foo().

+ +

Кожен об'єкт має властивість __proto__ (за винятком Object); кожна функція має властивість prototype. Тобто об'єкти можуть відноситись один до одного згідно "прототипного наслідування". Перевірити наслідування можна, порівнюючи властивість __proto__ об'єкту із об'єктом prototype функції. JavaScript надає скорочення: оператор instanceof порівнює об'єкт і функцію, і повертає true, якщо об'єкт є нащадком прототипу функції. Наприклад:

+ +
var f = new Foo();
+var isTrue = (f instanceof Foo);
+ +

Для більш докладного прикладу, припустимо, що у нас є набір визначень із показаних у Наслідування властивостей. Створімо об'єкт Engineer:

+ +
var chris = new Engineer('Pigman, Chris', ['jsd'], 'fiji');
+
+ +

Наступні вирази стосовно цього об'єкту являються істинними:

+ +
chris.__proto__ == Engineer.prototype;
+chris.__proto__.__proto__ == WorkerBee.prototype;
+chris.__proto__.__proto__.__proto__ == Employee.prototype;
+chris.__proto__.__proto__.__proto__.__proto__ == Object.prototype;
+chris.__proto__.__proto__.__proto__.__proto__.__proto__ == null;
+
+ +

Враховуючи це, ми можемо ось так написати функцію instanceOf:

+ +
function instanceOf(object, constructor) {
+   object = object.__proto__;
+   while (object != null) {
+      if (object == constructor.prototype)
+         return true;
+      if (typeof object == 'xml') {
+        return constructor.prototype == XML.prototype;
+      }
+      object = object.__proto__;
+   }
+   return false;
+}
+
+ +
Зверніть увагу, що: ця реалізація додатково перевіряє відношення об'єкту до типу "xml",  щоб обійти особливість уявлення XML-об'єктіву останніх версіях JavaScript. Дивіться {{ bug(634150) }}, якщо вам потрібна докладніша інформація.
+ +

Наступні вирази із визначеною вище функцією instanceOf являються істинними:

+ +
instanceOf(chris, Engineer)
+instanceOf(chris, WorkerBee)
+instanceOf(chris, Employee)
+instanceOf(chris, Object)
+
+ +

Проте такий приклад в результаті видасть false:

+ +
instanceOf(chris, SalesPerson)
+
+ +

Глобальна інформація у конструкторах

+ +

Потрібно бути уважним при створенні конструкторів, якщо ви задаєте в них якісь глобальні дані. Наприклад, припустимо, нам потрібно автоматично задавати унікальний ID кожному новому робітнику. Ви можете об'явити Employee так:

+ +
var idCounter = 1;
+
+function Employee(name, dept) {
+   this.name = name || '';
+   this.dept = dept || 'general';
+   this.id = idCounter++;
+}
+
+ +

Згідно цього визначення Employee, під час створення нового екземпляру конструктор призначає йому наявний ID, і потім підвищує на 1 глобальний лічильник ID. Тобто, якщо виконати наступні інструкції, victoria.id буде 1, а harry.id — 2:

+ +
var victoria = new Employee('Pigbert, Victoria', 'pubs');
+var harry = new Employee('Tschopik, Harry', 'sales');
+
+ +

На перший погляд все чудово. Однак, idCounter змінюється кожного разу, коли створюється екземпляр Employee, байдуже для чого. Якщо створити всю ієрархію Employee, наведену у цьому розділі, конструктор Employee буде викликано кожного разу при заданні прототипу. Припустимо, у нас є наступний код:

+ +
var idCounter = 1;
+
+function Employee(name, dept) {
+   this.name = name || '';
+   this.dept = dept || 'general';
+   this.id = idCounter++;
+}
+
+function Manager(name, dept, reports) {...}
+Manager.prototype = new Employee;
+
+function WorkerBee(name, dept, projs) {...}
+WorkerBee.prototype = new Employee;
+
+function Engineer(name, projs, mach) {...}
+Engineer.prototype = new WorkerBee;
+
+function SalesPerson(name, projs, quota) {...}
+SalesPerson.prototype = new WorkerBee;
+
+var mac = new Engineer('Wood, Mac');
+
+ +

Далі припустимо, що визначення, що опущені тут мають властивість base і викликають констуктор, що знаходиться вище у ланцюжку прототипів. У цьому випадку, у момент створення об'єкту mac, mac.id буде 5.

+ +

Залежно від застосування, таке додаткове збільшення лічильника може мати, чи не мати значення. Якщо для вас важливе справжнє значення лічильника, один із варіантів рішення матиме такий вигляд конструктора:

+ +
function Employee(name, dept) {
+   this.name = name || '';
+   this.dept = dept || 'general';
+   if (name)
+      this.id = idCounter++;
+}
+
+ +

При створенні екземпляру Employee для застосування в якості прототипу аргументи не задаються. Згідно цього визначення конструктора, коли ми не передаємо аргументи, конструктор не задає значення id та не оновлює лічильник. Таким чином, щоб отримати Employee із призначеним id, необхідно задати ім'я робітника. У цьому випадку mac.id буде дорівнювати 1.

+ +

Інший варіант  створювати копію об'єкту-прототипу Employee, щоб потім присвоювати її WorkerBee:

+ +
WorkerBee.prototype = Object.create(Employee.prototype);
+// instead of WorkerBee.prototype = new Employee
+
+ +

Відсутність множинного успадкування

+ +

Деякі об'єктно-орієнтовані мови програмування дозволяють множинне успадкування. Це означає, що об'єкт може наслідувати поля і властивості від незалежних батьківських об'єктів. JavaScript не підтримує такий тип наслідування.

+ +

Наслідування значення властивості відбувається в момент виконання програми, коли JavaScript шукає значення властивості у ланцюжку прототипів об'єкту. Так як об'єкт має лише один прототип, JavaScript не може виконувати наслідування від більш ніж одного прототипного ланцюжка.

+ +

У JavaScript ми можемо мати функцію-конструктор, що викликає два чи більше інших конструкторів під час виконання. Це дає певну ілюзію множинного наслідування. Наприклад, припустимо, у нас є такі інструкції:

+ +
function Hobbyist(hobby) {
+   this.hobby = hobby || 'scuba';
+}
+
+function Engineer(name, projs, mach, hobby) {
+   this.base1 = WorkerBee;
+   this.base1(name, 'engineering', projs);
+   this.base2 = Hobbyist;
+   this.base2(hobby);
+   this.machine = mach || '';
+}
+Engineer.prototype = new WorkerBee;
+
+var dennis = new Engineer('Doe, Dennis', ['collabra'], 'hugo');
+
+ +

Далі припустимо, що визначення WorkerBee відповідає вказаному вище у розділі. У цьому випадку об'ект dennis матиме такі значення властивостей:

+ +
dennis.name == 'Doe, Dennis';
+dennis.dept == 'engineering';
+dennis.projects == ['collabra'];
+dennis.machine == 'hugo';
+dennis.hobby == 'scuba';
+
+ +

Тобто dennis отримує поле hobby з конструктора Hobbyist. Однак, якщо ми потім додамо нову властивість до прототипу конструктора Hobbyist:

+ +
Hobbyist.prototype.equipment = ['mask', 'fins', 'regulator', 'bcd'];
+
+ +

Об'єкт dennis не успадковує цю нову властивість.

+ +
{{PreviousNext("Web/JavaScript/Guide/Working_with_Objects", "Web/JavaScript/Guide/Using_promises")}}
diff --git a/files/uk/web/javascript/guide/dokladno_pro_objectnu_model/index.html b/files/uk/web/javascript/guide/dokladno_pro_objectnu_model/index.html deleted file mode 100644 index 5e756710dd..0000000000 --- a/files/uk/web/javascript/guide/dokladno_pro_objectnu_model/index.html +++ /dev/null @@ -1,760 +0,0 @@ ---- -title: Докладно про об'єктну модель -slug: Web/JavaScript/Guide/Dokladno_pro_Objectnu_Model -tags: - - Guide - - Intermediate - - JavaScript - - Object -translation_of: Web/JavaScript/Guide/Details_of_the_Object_Model ---- -
{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Working_with_Objects", "Web/JavaScript/Guide/Using_promises")}}
- -

JavaScript - це об'єктна мова, що заснована на прототипах, а не на класах. У зв'язку з цим може бути менш очевидно, як саме JavaScript  дозволяє створювати ієрархії об'єктів із наслідуванням їх властивостей та значень. Цей розділ є спробою дещо прояснити цей механізм.

- -

Вміст цього розділу розрахований на те, що ви вже, принаймні, дещо знайомі з мовою JavaScript, і застосовували його функції для створення простих об'єктів.

- -

Мови з класовою та прототипною моделлю

- -

Об'єктно-орієнтовані мови з класовою моделлю, такі як Java і C++, засновані на концепції двох окремих сутностей: класів та екземплярів.

- - - -

Мови з прототипною моделлю наслідування, такі як JavaScript, не розділяють ці сутності: у них просто є об'єкти. Такі мови реалізовують поняття об'єкту-прототипу — об'єкту, що використовується як зразок, з якого вибираються початкові властивості для нового об'єкту. Будь-який об'єкт може вказати власні властивості, як в момент створення, так і під час виконання. Ну і на додачу, будь-який об'єкт можна задати в якості прототипу з іншого об'єкту — таким чином перший об'єкт розділить свої властивості з другим.

- -

Задання і визначення класу

- -

У мовах із класовою моделлю, класс задається у окремому визначенні класу. У цому визначенні можна вказати особливі методи, що називаються конструкторами, щоб створити екземпляри класу. Метод-конструктор може задати початкові значення властивостей екземпляру, і виконати якісь інші задачі прямо у момент створення. Для створення екземплярів застосовується оператор new у комбінації із методом-конструктором.

- -

JavaScript слідує подібній моделі, проте не має відокремленого від конструктора визначення класу. Натомість, ви одразу задаєте функцію-конструктор, щоб створити об'єкти із відповідним початковим набором властивостей та значень. Будь-яка JavaScript-функція може використовуватись як конструктор. Для створення нового об'єкту так само використовується оператор new із фукнцією-конструктором.

- -

 

- -
-

Зауважте, що ECMAScript 2015 вводить визначення класу:

- -
-

Класи JavaScript, введені стандартом ECMAScript 2015, є лише синтаксичним цукром поверх уже наявного у JavaScript прототипного наслідування. Тобто ці класи не вводять у JavaScript нової моделі наслідуваня.

-
-
- -

 

- -

Дочірні класи і наслідування

- -

У мові з класовою моделлю наслідкування ієрархія класів створюється через визначення класу. У цьому визначенні можна окремо вказати, що новий клас являється дочірнім стосовно уже наявного класу. Дочірній клас отримає всі властивості батьківського і може привнести нові (або ж змінити успадковані). Наприклад, припустимо, що клас Employee включає в себе лише поля name та dept, і Manager - це дочірній клас Employee, що додає властивість reports. У цьому випадку, екземпляр класу Manager матиме три властивості: name, dept, та reports.

- -

JavaScript реалізовує наслідування дещо інакше. Він дозволяє пов'язувати об'єкт-прототип із будь-якою фукнцією-конструктором. Тобто ви можете точнісінько реалізувати приклад EmployeeManager, проте використовуючи дещо інші терміни. Спершу ви визначаєте конструктор Employee, задаючи властивості name та dept. Далі ви визначаєте фукнцію-конструктор Manager, що викликає конструктор Employee та задає властивість reports. Насамкінець, призначаєте новий об'єкт, отриманий з Employee.prototype в якості прототипу конструктора Manager. Надалі, при створенні екземпляра Manager він наслідує властивості name і dept з об'єкту Employee.

- -

Додавання і видалення властивостей

- -

Зазвичай у мовах із класовою моделлю наслідування класи створюються під час компіляції, а екземпляри класів - під час компіляції чи виконання програми. Після того, як його було визначено, не можна змінити кількість або тип його властивостей. Однак, у JavaScript можна додавати чи видаляти властивості будь-якого об'єкту безпосередньо під час виконання програми. Якщо додати нову властивість до об'єкту-прототипу певного набору об'єктів, вони всі також отримають цю властивість.

- -

Підсумок відмінностей класової і прототипної моделей

- -

Наступна таблиця надає короткий підсумок цих відмінностей. Решта розділу розкриває деталі застосування JavaScript-конструкторів і прототипів для створення ієрархії об'єктів, та порівнює це із тим, як би це робилось у Java.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Порівняння мови із класовою моделлю наслідування (Java) і прототипною (JavaScript)
Класова модель (Java)Прототипна модель (JavaScript)
Клас та його екземпляр - окремі сутності.Всі об'єкти можуть наслідувати інші об'єкти.
Визначення класу описує його; екземпляри створюються методами-конструкторами.Функції-конструктори і описують, і створюють набори об'єктів.
Окремий об'єкт створюється оператором new.Так само.
Ієрархія об'єктів формується при визначенні класів, шляхом задання нащадків для уже наявних класів.Ієрархія об'єктів формується шляхом призначення об'єкту прототипом функції-конструктора.
Властивості наслідуються згідно ланцюжка класів.Властивості наслідуються згідно ланцюжка прототипів.
Визначення класу задає всі властивості всіх екземплярів класу. Неможливо динамічно додавати властивості під час виконання програми.Функція-конструктор чи прототип задають лише початковий набір властивостей. Можна додавати чи видаляти властивості як окремого об'єкту, так певного їх набору.
- -

Приклад із робітником "Employee"

- -

Надалі у розділі ієрархія робітників, що показана на наступному зображенні.

- -
-
-

Проста ієрархія об'єктів, сформована із наступних елементів:

- -

-
- -
-
    -
  • Employee має поля name (із порожнім рядком в якості значення за замовчуванням) та dept (у якого значення за замовчуванням — "general").
  • -
  • Manager заснований на Employee. Він додає властивість reports  (за замовчуванням містить порожній масив для об'єктів Employee).
  • -
  • WorkerBee також заснований на Employee. Він додає властивість projects (за замовчуванням містить порожній масив, призначений для рядків).
  • -
  • SalesPerson заснований на WorkerBee. Він додає властивість quota (за замовчуванням — число 100). Він також перевизначае властивість dept, надаючи їй нове значенням "sales" (що означає, що всі SalesPerson відносяться до одного відділу).
  • -
  • Engineer заснований на WorkerBee. Він додає властивість machine (значення за замовчуванням — порожній рядок) і перевизначає властивість dept, задаючи їй значення "engineering".
  • -
-
-
- -

Створення ієрархії

- -

Існує декілька способів задати відповідні функції-конструктори, щоб реалізувати ієрархію робітників. Який спосіб обрати — значною мірою залежить від того, які можливості ви хочете отримати від вашого додатку.

- -

Цей розділ показує, як використовувати дуже прості (і відносно негнучкі) визначення, і таким чином демонструє, як отримати робочий механізм наслідування. У цих визначеннях не можна задати жодного значення при створенні об'єкту — він отримає властивості із значеннями за замовчуванням, які можна буде змінити пізніше.

- -

У реальному додатку ви б, ймовірно, визначали конструктор, що дозволяє задавати значення в момент створення об'єкту (докладніше у Більш гнучкі конструктори). А наразі ці прості визначення покажуть, як загалом відбувається наслідування.

- -

Наступні визначення Employee у Java та JavaScript ідентичні. Єдина відмінність — у Java необхідно явно вказувати тип кожної властивості, на відміну від JavaScript (так як Java — мова із сильною типізацією, а JavaScript — із слабкою).

- -
-

JavaScript

- -
function Employee() {
-  this.name = '';
-  this.dept = 'general';
-}
-
- -


- Java

- -
public class Employee {
-   public String name = "";
-   public String dept = "general";
-}
-
-
- -

Визначення Manager і WorkerBee показують різницю у заданні батьківського об'єкту. У JavaScript ви додаєте екземпляр прототипу в якості значення поля prototype функції-конструктора, а потім перевизначаєте prototype.constructor, щоб це поле вказувало на функцію-конструктор. Ви можете це зробити в будь-якому місці після визначення конструктора. У Java надклас задається всередині визначення класу, і його ніяк не можна змінити зовні визначення класу.

- -
-

JavaScript

- -
function Manager() {
-  Employee.call(this);
-  this.reports = [];
-}
-Manager.prototype =
-    Object.create(Employee.prototype);
-Manager.prototype.constructor = Manager;
-
-function WorkerBee() {
-  Employee.call(this);
-  this.projects = [];
-}
-WorkerBee.prototype =
-    Object.create(Employee.prototype);
-WorkerBee.prototype.constructor = WorkerBee;
-
- -


- Java

- -
public class Manager extends Employee {
-   public Employee[] reports =
-       new Employee[0];
-}
-
-
-
-public class WorkerBee extends Employee {
-   public String[] projects = new String[0];
-}
-
-
-
-
- -

 

- -

Визначення Engineer та SalesPerson створюють об'єкти, що наслідуються вже від WorkerBee, а, отже, і від Employee. Об'єкти цих типів мають властивості всіх об'єктів вище у ланцюжку наслідування. Надодачу, ці визначення перевизначають успадковані значення поля dept, змінюючи їх відповідно до нового типу.

- -
-

JavaScript

- -
function SalesPerson() {
-   WorkerBee.call(this);
-   this.dept = 'sales';
-   this.quota = 100;
-}
-SalesPerson.prototype =
-    Object.create(WorkerBee.prototype);
-SalesPerson.prototype.constructor = SalesPerson;
-
-function Engineer() {
-   WorkerBee.call(this);
-   this.dept = 'engineering';
-   this.machine = '';
-}
-Engineer.prototype =
-    Object.create(WorkerBee.prototype);
-Engineer.prototype.constructor = Engineer;
-
- -


- Java

- -
public class SalesPerson extends WorkerBee {
-   public String dept = "sales";
-   public double quota = 100.0;
-}
-
-
-public class Engineer extends WorkerBee {
-   public String dept = "engineering";
-   public String machine = "";
-}
-
-
-
- -

Таким чином, ви можете створювати екземпляри об'єктів із уже заданими значеннями для своїх властивостей. Наступна схема ілюструє застосування цих JavaScript-визначень для створення нових об'єктів, і демонструє значення їх властивостей.

- -
-

Зауважте, що: термін екземпляр має специфічний технічний зміст у мовах із класовою моделлю. У цих мовах екземпляр являється окремою реалізацією класу і корінним чином відрізняється від його визначення. У JavaScript, "екземпляр" не має такого особливого змісту, бо сам JavaScript не має такої значної відмінності класів від їх реалізацій. Однак, у контексті JavaScript, "екземпляр" може неформально позначати об'єкт, створений певною функцією-конструктором. Тому, згідно наступного прикладу, можна неформально стверджувати, що jane є екземпляром класу Engineer. Так само, хоча терміни предок, нащадок, дочірній і батьківський класи не мають формального смісту в JavaScript, їх можна застосовувати для позначення об'єктів, що знаходяться вище чи нижче у ланцюжку прототипів.

-
- -

Створення об'єктів за допомогою простих визначень

- -
-

Ієрархія об'єктів

- -

Наступна ієрархія створена за допомогою коду у правій частині.

- -

- -

Окремі об'єкти = Jim, Sally, Mark, Fred, Jane, etc.
- "Екземпляри", створені конструктором

- -
var jim = new Employee;
-// Дужки можна опустити, якщо
-// конструктор не приймає аргументів.
-// jim.name має значення ''
-// jim.dept має значення 'general'
-
-var sally = new Manager;
-// sally.name має значення ''
-// sally.dept має значення 'general'
-// sally.reports має значення []
-
-var mark = new WorkerBee;
-// mark.name має значення ''
-// mark.dept має значення 'general'
-// mark.projects має значення []
-
-var fred = new SalesPerson;
-// fred.name має значення ''
-// fred.dept має значення 'sales'
-// fred.projects має значення []
-// fred.quota має значення 100
-
-var jane = new Engineer;
-// jane.name має значення ''
-// jane.dept має значення 'engineering'
-// jane.projects має значення []
-// jane.machine має значення ''
-
-
- -

Властивості (поля) об'єкту

- -

Ця секція описує, як об'єкти наслідують властивості інших об'єктів у ланцюжку прототипів, і що відбувається, якщо додати властивість під час виконання програми.

- -

Наслідування властивостей

- -

Припустимо, такою інструкцією ви створили екземпляр WorkerBee — об'єкт mark:

- -
var mark = new WorkerBee;
-
- -

Коли JavaScript бачить оператор new, він створює загальний об'єкт і неявно встановлює WorkerBee.prototype значенням внутрішньої властивості [[Prototype]], і передає цей новий об'єкт як значення this до фукнції-конструктора WorkerBee. Внутрішня властивість [[Prototype]] визначає ланцюжок прототипів для виводу значень полів. Коли ці властивості задані, JavaScript повертає новий об'єкт, а інструкція присвоєння задає його в якості значення змінної mark.

- -

Описаний процес явно не встановлює значення об'єкту mark для властивостей (локальні значення), які mark наслідує з ланцюжка прототипів. Коли ви запитуєте значення властивості, JavaScript в першу чергу перевіряє наявність цього значення у об'єкті, і повертає його, якщо знаходить. Якщо ж ні, JavaScript перевіряє весь ланцюжок прототипів (за допомогою властивості [[Prototype]]). Якщо об'єкт у ланцюжку має таку властивість - буде повернуто її значення (або повідомлення, що об'єкт не має такої властивості, якщо її все-таки не було знайдено). Таким чином, об'єкт mark має наступні властивості і значення:

- -
mark.name = '';
-mark.dept = 'general';
-mark.projects = [];
-
- -

З конструктора Employee об'єкту mark призначено локальні значення для властивостей name та dept, а з конструктора WorkerBee — значення властивості projects. Таким чином ми отримуємо наслідування властивостей і їх значень у JavaScript. Деякі тонкощі цього процесу додатково висвітлені у Іще раз про наслідування властивостей.

- -

Так як ці конструктори не дозволяють задати специфічні для екземпляру значення, це являється загальним прикладом. В якості значень властивостей взяті значення за замовчуванням, що розповсюджуються на всі об'єкти, створені на основі WorkerBee. Звісно, значення цих властивостей можна змінити. Наприклад, так можна встановити їх значення для об'єкту mark:

- -
mark.name = 'Doe, Mark';
-mark.dept = 'admin';
-mark.projects = ['navigator'];
- -

Додавання властивостей

- -

У JavaScript, можна додавати властивості до об'єкту безпосередно під час виконання. Ви не обмежені застосуванням лише властивостей, наданих конструктором. Щоб додати нову властивість до окремого об'єкту, просто призначте йому нове значення, як наведено далі:

- -
mark.bonus = 3000;
-
- -

Тепер об'єкт mark містить властивість bonus, проте більше ніхто із WorkerBee її не має.

- -

Якщо додати нову властивість до об'єкту-прототипу іншого конструктора, то ця властивість з'явиться у всіх об'єктів, що наслідують властивості від прототипу. Наприклад, ось так можна додати властивість specialty всім робітникам:

- -
Employee.prototype.specialty = 'none';
-
- -

Як тільки JavaScript виконає інструкцію, об'єкт mark матиме властивість specialty із значенням "none". Наступна схема ілюструє ефект від додавання цієї властивості до прототипу Employee і її перевизначення у прототипі Engineer.

- -


- Додавання властивостей

- -

Більш гнучкі конструктори

- -

Наведені раніше функції-конструктори не дозволяють задавати значення під час створенні екземпляру. Як і у Java, можна надати конструктору аргументи для ініціалізації значень властивостей у об'єктів. Наступна схема показує один із способів це зробити.

- -


- Задання властивостей у конструкторі, варіант 1

- -

Таблиця далі показує визначення цих об'єктів у Java і JavaScript.

- -
-

JavaScript

- -

Java

-
- -
-
function Employee(name, dept) {
-  this.name = name || '';
-  this.dept = dept || 'general';
-}
-
- -

 

- -

 

- -

 

- -

 

- -

 

- -
public class Employee {
-   public String name;
-   public String dept;
-   public Employee () {
-      this("", "general");
-   }
-   public Employee (String name) {
-      this(name, "general");
-   }
-   public Employee (String name, String dept) {
-      this.name = name;
-      this.dept = dept;
-   }
-}
-
-
- -
-
function WorkerBee(projs) {
-
- this.projects = projs || [];
-}
-WorkerBee.prototype = new Employee;
-
- -

 

- -

 

- -

 

- -
public class WorkerBee extends Employee {
-   public String[] projects;
-   public WorkerBee () {
-      this(new String[0]);
-   }
-   public WorkerBee (String[] projs) {
-      projects = projs;
-   }
-}
-
-
- -
-
-function Engineer(mach) {
-   this.dept = 'engineering';
-   this.machine = mach || '';
-}
-Engineer.prototype = new WorkerBee;
-
- -

 

- -

 

- -

 

- -
public class Engineer extends WorkerBee {
-   public String machine;
-   public Engineer () {
-      dept = "engineering";
-      machine = "";
-   }
-   public Engineer (String mach) {
-      dept = "engineering";
-      machine = mach;
-   }
-}
-
-
- -

Ці JavaScript-визначення застосовують особливу ідіому для задання значення за замовчуванням:

- -
this.name = name || '';
-
- -

Логічний оператор АБО у JavaScript (||) обчислює перше значення. Якщо результат можна привести до true, оператор повертає його, а інакше - значення другого аргументу. Таким чином, ця стрічка коду перевіряє, чи name має якесь корисне значення для властивості name. Якщо так — this.name отримує її значення, а інакше значенням this.name стає порожній рядок. У розділі ця ідіома застосовується для стислості; однак вона може бути неочевидною на перший погляд.

- -
-

Зауважте, що: це може працювати не так, як очікується, якщо конструктор викликається із аргументами, що приводяться до false (число 0 і порожній рядок (""). У цьому випадку буде обрано значення за замовчуванням.

-
- -

Таким чином можливо задати значення для властивостей на місці, безпосередньо під час створення екземпляру об'єкту. Наступною інструкцією ви можете створити новий екземпляр Engineer:

- -
var jane = new Engineer('belau');
-
- -

Властивості Jane тепер виглядають так:

- -
jane.name == '';
-jane.dept == 'engineering';
-jane.projects == [];
-jane.machine == 'belau';
-
- -

Зауважте, що таким визначенням ви не можете задати первинне значення для наслідуваного поля name. Для задання значення наслідуваним властивостям у JavaScript, необхідно додати трохи більше коду до фукнції-конструктора.

- -

Поки що фукнція-конструктор створила загальний об'єкт, задала на місці властивості і значення нового об'єкту. Можна зробити, щоб конструктор додавав властивості безпосередньо викликаючи конструктор об'єкта, вищого у ієрархії прототипів. Власне, як зображено у наступній схемі.

- -


- Задання властивостей у конструкторі, варіант 2

- -

Розгляньмо детальніше одне із цих визначень. Ось новий конструктор Engineer:

- -
function Engineer(name, projs, mach) {
-  this.base = WorkerBee;
-  this.base(name, 'engineering', projs);
-  this.machine = mach || '';
-}
-
- -

Припустимо, ви ось так створюєте новий об'єкт Engineer:

- -
var jane = new Engineer('Doe, Jane', ['navigator', 'javascript'], 'belau');
-
- -

Тут JavaScript виконує наступні кроки:

- -
    -
  1. Оператор new створює загальний об'єкт і задає Engineer.prototype значенням його властивості __proto__ .
  2. -
  3. Оператор new передає новий об'єкт у конструктор Engineer в якості значення this.
  4. -
  5. Конструктор створює нову властивість base для цього об'єкту і присвоює їй значення конструктора WorkerBee. Так конструктор WorkerBee стає методом об'єкту Engineer. Назва властивості base не є чимось особливим. Ви можете використати будь-яке дозволене ім'я властивості, а base просто звучить змістовно для даного випадку.
  6. -
  7. Конструктор викликає метод base, передаючи в нього два своїх аргументи ("Doe, Jane" і ["navigator", "javascript"]) і новий рядок "engineering". Явно вказаний "engineering" у конструкторі означає, що всі об'єкти Engineer матимуть одне значення для наслідуваної властивості dept, і це значення заміщує успадковане від Employee.
  8. -
  9. Так як метод base належить Engineer, всередині виклику base JavaScript прив'язує значення this до об'єкту, створеного на першому етапі. Таким чином функція WorkerBee, в свою чергу, передає аргументи "Doe, Jane" та "engineering" до конструктора Employee. Після повернення з конструктора Employee функція WorkerBee задає останнім аргументом поле projects.
  10. -
  11. Після повернення з методу base конструктор Engineer ініціалізовує властивість machine об'єкту значенням "belau".
  12. -
  13. Після повернення з конструктору JavaScript присвоює новий об'єкт змінній jane.
  14. -
- -

Може скластися враження, що, викликавши конструтктор WorkerBee зсередини конструктора Engineer, ви вкажете наслідування відповідно для об'єктів Engineer. Насправді виклик конструктора WorkerBee гарантує, що об'єкт Engineer матиме всі властивості, вказані у всіх викликаних конструкторах. Однак, якщо пізніше додати нові властивості до прототипів Employee чи WorkerBee, вони не будуть успадковані об'єктом Engineer. Припустимо, у нас є наступні інструкції:

- -
function Engineer(name, projs, mach) {
-  this.base = WorkerBee;
-  this.base(name, 'engineering', projs);
-  this.machine = mach || '';
-}
-var jane = new Engineer('Doe, Jane', ['navigator', 'javascript'], 'belau');
-Employee.prototype.specialty = 'none';
-
- -

Об'єкт jane не наслідує властивість specialty. Вам все ще необхідно явно вказувати прототип для гарантії динамічного наслідування. Натомість розглянемо такий набір інструкцій:

- -
function Engineer(name, projs, mach) {
-  this.base = WorkerBee;
-  this.base(name, 'engineering', projs);
-  this.machine = mach || '';
-}
-Engineer.prototype = new WorkerBee;
-var jane = new Engineer('Doe, Jane', ['navigator', 'javascript'], 'belau');
-Employee.prototype.specialty = 'none';
-
- -

Тепер значенням властивості specialty об'єкту jane являється "none".

- -

Іншим способом наслідування являється використання методів call() чи apply(). Ось дві еквівалентні ділянки коду:

- -
-
function Engineer(name, projs, mach) {
-  this.base = WorkerBee;
-  this.base(name, 'engineering', projs);
-  this.machine = mach || '';
-}
-
- -
function Engineer(name, projs, mach) {
-  WorkerBee.call(this, name, 'engineering', projs);
-  this.machine = mach || '';
-}
-
-
- -

Використання методу call() дає більш чисту реалізацію, так як base більше не потрібен.

- -

Іще раз про наслідування властивостей

- -

У попередніх частинах було описано, як конструктори і прототипи JavaScript дозволяють реалізовувати ієрархію та наслідування. Ця частина розглядає деякі тонкощі, які, можливо, не були очевидними у наведеному вище тексті.

- -

Локальні і успадковані змінні

- -

Коли ви викликаєте властивість, JavaScript виконує наступні кроки (як описано вище у главі):

- -
    -
  1. Перевіряє наявність цієї змінної прямо в об'єкті, і повертає її значення, якщо знаходить.
  2. -
  3. Якщо її немає серед локальних змінних - перевіряє ланцюжок прототипів (використовуючи властивість __proto__).
  4. -
  5. Якщо прототип у ланцюжку має значення вказаної властивості — повертає це значення.
  6. -
  7. Якщо вказана властивість не знайдена — значить, об'єкт її не має.
  8. -
- -

Результат виконання цих кроків залежить від того, як ви задаєте значення і об'єкти.  Перший приклад мав такі визначення:

- -
function Employee() {
-  this.name = '';
-  this.dept = 'general';
-}
-
-function WorkerBee() {
-  this.projects = [];
-}
-WorkerBee.prototype = new Employee;
-
- -

Припустимо, враховуючи ці визначення, що наступною інструкцією ви створили екземпляр WorkerBee у змінній amy:

- -
var amy = new WorkerBee;
-
- -

Об'єкт amy має одну локальну змінну — projects. Значення властивостей name та dept насправді не належать amy, і тому виводяться через поле її поле __proto__. Отже, amy має такі значення властивостей:

- -
amy.name == '';
-amy.dept == 'general';
-amy.projects == [];
-
- -

Тепер припустимо, що ви змінили значення властивості name у прототипі, асоційованому з Employee:

- -
Employee.prototype.name = 'Unknown';
-
- -

На перший погляд, можна очікувати, що нове значення пошириться на всі екземпляри Employee. Однак, це не так.

- -

При створенні будь-якого екземпляру об'єкту Employee, цей екземпляр отримає локальне значення для властивості name (порожній рядок). Тобто, коли ми задаємо прототип WorkerBee шляхом створення нового об'єкту Employee, WorkerBee.prototype має локальне значення властивості name. Отже, коли JavaScript шукає властивість name об'єкту amy (екземпляр WorkerBee), він знаходить місцеве значення властивості у WorkerBee.prototype. І тому він не намагається шукати далі в ланцюжку прототипів до Employee.prototype.

- -

Якщо ви хочете змінити значення властивості під час виконання, та ще й так, щоб воно поширилось на всіх нащадків  об'єкту, слід визначати це значення не у конструкторі об'єкту, а у прототипі конструктора. Припустимо, наприклад, що ви змінили попередній варіант реалізації на такий:

- -
function Employee() {
-  this.dept = 'general';    // Зауважте, що тут немає this.name (локальної змінної)
-}
-Employee.prototype.name = '';    // Одна копія
-
-function WorkerBee() {
-  this.projects = [];
-}
-WorkerBee.prototype = new Employee;
-
-var amy = new WorkerBee;
-
-Employee.prototype.name = 'Unknown';
-
- -

У цьому випадку, властивість amy name стане "Unknown".

- -

Як ілюструють ці приклади, якщо вам потрібно і мати значення за замовчуванням для властивостей об'єктів, і можливість змінювати ці значення за замовчуванням під час виконання, слід задавати властивості у прототипі конструктора, а не у самому конструкторі.

- -

Визначення відносин екземпляру

- -

Пошук властивості у JavaScript виконується серед власних властивостей об'єкту, і, якщо властивість з даним іменем не була знайдена, пошук переходить всередину особливої властивості __proto__. Це відбувається рекурсивно, і цей процес називається "пошук у ланцюжку прототипів".

- -

Властивість __proto__ встановлюється у момент конструювання об'єкту; вказує вона на властивість prototype конструктора. Тобто вираз new Foo() створює об'єкт із__proto__ == Foo.prototype. Відповідно, зміни у Foo.prototype впливають на пошук властивості всіх об'єктів, створених через new Foo().

- -

Кожен об'єкт має властивість __proto__ (за винятком Object); кожна функція має властивість prototype. Тобто об'єкти можуть відноситись один до одного згідно "прототипного наслідування". Перевірити наслідування можна, порівнюючи властивість __proto__ об'єкту із об'єктом prototype функції. JavaScript надає скорочення: оператор instanceof порівнює об'єкт і функцію, і повертає true, якщо об'єкт є нащадком прототипу функції. Наприклад:

- -
var f = new Foo();
-var isTrue = (f instanceof Foo);
- -

Для більш докладного прикладу, припустимо, що у нас є набір визначень із показаних у Наслідування властивостей. Створімо об'єкт Engineer:

- -
var chris = new Engineer('Pigman, Chris', ['jsd'], 'fiji');
-
- -

Наступні вирази стосовно цього об'єкту являються істинними:

- -
chris.__proto__ == Engineer.prototype;
-chris.__proto__.__proto__ == WorkerBee.prototype;
-chris.__proto__.__proto__.__proto__ == Employee.prototype;
-chris.__proto__.__proto__.__proto__.__proto__ == Object.prototype;
-chris.__proto__.__proto__.__proto__.__proto__.__proto__ == null;
-
- -

Враховуючи це, ми можемо ось так написати функцію instanceOf:

- -
function instanceOf(object, constructor) {
-   object = object.__proto__;
-   while (object != null) {
-      if (object == constructor.prototype)
-         return true;
-      if (typeof object == 'xml') {
-        return constructor.prototype == XML.prototype;
-      }
-      object = object.__proto__;
-   }
-   return false;
-}
-
- -
Зверніть увагу, що: ця реалізація додатково перевіряє відношення об'єкту до типу "xml",  щоб обійти особливість уявлення XML-об'єктіву останніх версіях JavaScript. Дивіться {{ bug(634150) }}, якщо вам потрібна докладніша інформація.
- -

Наступні вирази із визначеною вище функцією instanceOf являються істинними:

- -
instanceOf(chris, Engineer)
-instanceOf(chris, WorkerBee)
-instanceOf(chris, Employee)
-instanceOf(chris, Object)
-
- -

Проте такий приклад в результаті видасть false:

- -
instanceOf(chris, SalesPerson)
-
- -

Глобальна інформація у конструкторах

- -

Потрібно бути уважним при створенні конструкторів, якщо ви задаєте в них якісь глобальні дані. Наприклад, припустимо, нам потрібно автоматично задавати унікальний ID кожному новому робітнику. Ви можете об'явити Employee так:

- -
var idCounter = 1;
-
-function Employee(name, dept) {
-   this.name = name || '';
-   this.dept = dept || 'general';
-   this.id = idCounter++;
-}
-
- -

Згідно цього визначення Employee, під час створення нового екземпляру конструктор призначає йому наявний ID, і потім підвищує на 1 глобальний лічильник ID. Тобто, якщо виконати наступні інструкції, victoria.id буде 1, а harry.id — 2:

- -
var victoria = new Employee('Pigbert, Victoria', 'pubs');
-var harry = new Employee('Tschopik, Harry', 'sales');
-
- -

На перший погляд все чудово. Однак, idCounter змінюється кожного разу, коли створюється екземпляр Employee, байдуже для чого. Якщо створити всю ієрархію Employee, наведену у цьому розділі, конструктор Employee буде викликано кожного разу при заданні прототипу. Припустимо, у нас є наступний код:

- -
var idCounter = 1;
-
-function Employee(name, dept) {
-   this.name = name || '';
-   this.dept = dept || 'general';
-   this.id = idCounter++;
-}
-
-function Manager(name, dept, reports) {...}
-Manager.prototype = new Employee;
-
-function WorkerBee(name, dept, projs) {...}
-WorkerBee.prototype = new Employee;
-
-function Engineer(name, projs, mach) {...}
-Engineer.prototype = new WorkerBee;
-
-function SalesPerson(name, projs, quota) {...}
-SalesPerson.prototype = new WorkerBee;
-
-var mac = new Engineer('Wood, Mac');
-
- -

Далі припустимо, що визначення, що опущені тут мають властивість base і викликають констуктор, що знаходиться вище у ланцюжку прототипів. У цьому випадку, у момент створення об'єкту mac, mac.id буде 5.

- -

Залежно від застосування, таке додаткове збільшення лічильника може мати, чи не мати значення. Якщо для вас важливе справжнє значення лічильника, один із варіантів рішення матиме такий вигляд конструктора:

- -
function Employee(name, dept) {
-   this.name = name || '';
-   this.dept = dept || 'general';
-   if (name)
-      this.id = idCounter++;
-}
-
- -

При створенні екземпляру Employee для застосування в якості прототипу аргументи не задаються. Згідно цього визначення конструктора, коли ми не передаємо аргументи, конструктор не задає значення id та не оновлює лічильник. Таким чином, щоб отримати Employee із призначеним id, необхідно задати ім'я робітника. У цьому випадку mac.id буде дорівнювати 1.

- -

Інший варіант  створювати копію об'єкту-прототипу Employee, щоб потім присвоювати її WorkerBee:

- -
WorkerBee.prototype = Object.create(Employee.prototype);
-// instead of WorkerBee.prototype = new Employee
-
- -

Відсутність множинного успадкування

- -

Деякі об'єктно-орієнтовані мови програмування дозволяють множинне успадкування. Це означає, що об'єкт може наслідувати поля і властивості від незалежних батьківських об'єктів. JavaScript не підтримує такий тип наслідування.

- -

Наслідування значення властивості відбувається в момент виконання програми, коли JavaScript шукає значення властивості у ланцюжку прототипів об'єкту. Так як об'єкт має лише один прототип, JavaScript не може виконувати наслідування від більш ніж одного прототипного ланцюжка.

- -

У JavaScript ми можемо мати функцію-конструктор, що викликає два чи більше інших конструкторів під час виконання. Це дає певну ілюзію множинного наслідування. Наприклад, припустимо, у нас є такі інструкції:

- -
function Hobbyist(hobby) {
-   this.hobby = hobby || 'scuba';
-}
-
-function Engineer(name, projs, mach, hobby) {
-   this.base1 = WorkerBee;
-   this.base1(name, 'engineering', projs);
-   this.base2 = Hobbyist;
-   this.base2(hobby);
-   this.machine = mach || '';
-}
-Engineer.prototype = new WorkerBee;
-
-var dennis = new Engineer('Doe, Dennis', ['collabra'], 'hugo');
-
- -

Далі припустимо, що визначення WorkerBee відповідає вказаному вище у розділі. У цьому випадку об'ект dennis матиме такі значення властивостей:

- -
dennis.name == 'Doe, Dennis';
-dennis.dept == 'engineering';
-dennis.projects == ['collabra'];
-dennis.machine == 'hugo';
-dennis.hobby == 'scuba';
-
- -

Тобто dennis отримує поле hobby з конструктора Hobbyist. Однак, якщо ми потім додамо нову властивість до прототипу конструктора Hobbyist:

- -
Hobbyist.prototype.equipment = ['mask', 'fins', 'regulator', 'bcd'];
-
- -

Об'єкт dennis не успадковує цю нову властивість.

- -
{{PreviousNext("Web/JavaScript/Guide/Working_with_Objects", "Web/JavaScript/Guide/Using_promises")}}
diff --git a/files/uk/web/javascript/guide/expressions_and_operators/index.html b/files/uk/web/javascript/guide/expressions_and_operators/index.html new file mode 100644 index 0000000000..fdfbc0659b --- /dev/null +++ b/files/uk/web/javascript/guide/expressions_and_operators/index.html @@ -0,0 +1,925 @@ +--- +title: Вирази та оператори +slug: Web/JavaScript/Guide/Вирази_та_оператори +tags: + - JavaScript + - Оператори + - Посібник + - вирази +translation_of: Web/JavaScript/Guide/Expressions_and_Operators +--- +
{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Functions", "Web/JavaScript/Guide/Numbers_and_dates")}}
+ +

Цей розділ описує вирази та оператори JavaScript, такі як присвоювання, порівняння, арифметичні оператори, бітові, логічні, рядкові, тернарний та інші.

+ +

Повний та детальний список операторів та виразів також доступний за посиланням.

+ +

Оператори

+ +

JavaScript має наступні типи операторів. Ця секція описує оператори, а також містить інформацію щодо їхніх пріоритетів.

+ + + +

JavaScript має як бінарні, так і унарні оператори, а також один особливий тернарний оператор - умовний оператор. Бінарному оператору потрібні два операнди - один перед оператором, інший після оператора:

+ +
операнд1 оператор операнд2
+
+ +

Наприклад, 3+4 чи x*y.

+ +

Унарний оператор потребує лише одного операнду до чи після оператора:

+ +
оператор операнд
+
+ +

чи

+ +
операнд оператор
+
+ +

Наприклад, x++ чи ++x.

+ +

Оператори присвоєння

+ +

Оператор присвоєння присвоює своєму лівому операнду значення на підставі значення правого операнда. Простим оператором присвоєння є оператор дорівнює (=), який присвоює значення свого правого операнда лівому операнду. Таким чином, x = y присвоює значення змінної y змінній x.

+ +

Також існують складені оператори присвоєння, які є скороченнями для операцій, перелічених у наступній таблиці:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Складені оператори присвоювання
НазваОператор скороченого записуЗначення
Присвоєнняx = yx = y
Присвоєння з додаваннямx += yx = x + y
Присвоєння з відніманнямx -= yx = x - y
Присвоєння з множеннямx *= yx = x * y
Присвоєння з діленнямx /= yx = x / y
Присвоєння остачіx %= yx = x % y
Присвоєння з піднесенням до степеня{{experimental_inline}}x **= yx = x ** y
Присвоєння з лівим зсувомx <<= yx = x << y
Присвоєння з правим зсувомx >>= yx = x >> y
Присвоєння з беззнаковим правим зсувомx >>>= yx = x >>> y
Присвоєння з побітовим Іx &= yx = x & y
Присвоєння з виключним побітовим АБОx ^= yx = x ^ y
Присвоєння з побітовим АБОx |= yx = x | y
+ +

Деструктуризація

+ +

Для більш складних присвоювань використовується синтаксис деструктуризації. Це вираз JavaScript, який надає можливість витягувати дані з масивів та об'єктів, використовуючи синтаксис, що віддзеркалює конструкцію масивів та об'єктних літералів. 

+ +
var foo = ['один', 'два', 'три'];
+
+// без деструктуризації
+var one   = foo[0];
+var two   = foo[1];
+var three = foo[2];
+
+// із деструктуризацією
+var [one, two, three] = foo;
+
+ +

Оператори порівняння

+ +

Оператор порівняння порівнює свої операнди та повертає логічне значення, базуючись на істинності порівняння. Операнди можуть бути числовими, рядковими, логічними значеннями або об'єктами. Рядки порівнюються згідно стандартного лексикографічного порядку, з використанням значень Unicode. У більшості випадків, якщо два операнди не належать до одного типу, JavaScript намагається привести їх до належного для порівняння типу. Зазвичай це призводить до числового порівняння операндів. Єдиними винятками у конвертації типів під час порівняння є оператори === та !==, які виконують перевірку на строгу рівність та строгу нерівність. Ці оператори не намагаються перед перевіркою на рівність привести операнди до спільного типу. Наступна таблиця наводить оператори порівняння у контексті цього фрагменту коду:

+ +
var var1 = 3;
+var var2 = 4;
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Оператори порівняння
ОператорОписПриклади, які повертають true
Рівність (==)Повертає true, якщо оператори рівні.3 == var1 +

"3" == var1

+ 3 == '3'
Нерівність (!=)Повертає true, якщо оператори нерівні.var1 != 4
+ var2 != "3"
Строга рівність (===)Повертає true якщо оператори рівні та належать до одного типу. Дивіться також {{jsxref("Object.is")}} та однаковість у JS.3 === var1
Строга нерівність (!==)Повертає true, якщо оператори належать до одного типу, але нерівні, або належать до різних типів.var1 !== "3"
+ 3 !== '3'
Більше ніж (>)Повертає true, якщо лівий операнд більший за правий.var2 > var1
+ "12" > 2
Більше чи дорівнює (>=)Повертає true, якщо значення лівого операнда більше або дорівнює значенню правого операнда.var2 >= var1
+ var1 >= 3
Менше ніж (<)Повертає true, якщо лівий операнд менший за правий.var1 < var2
+ "2" < 12
Менше чи дорівнює (<=)Повертає true, якщо значення лівого операнда менше або дорівнює значенню правого операнда.var1 <= var2
+ var2 <= 5
+ +
+

Заувага: (=>) не оператор, а позначення для стрілкових функцій.

+
+ +

Арифметичні оператори

+ +

Арифметичний оператор приймає числові значення (літерали чи змінні) в якості операндів та повертає єдине числове значення. Стандартними арифметичними операторами є додавання (+), віднімання (-), множення (*) та ділення (/). Ці оператори працюють так само, як і в більшості інших мов програмування при використанні з числами з рухомою комою (зокрема, зауважте, що ділення на нуль повертає {{jsxref("Infinity")}}). Наприклад:

+ +
1 / 2; // 0.5
+1 / 2 == 1.0 / 2.0; // це дорівнює true
+
+ +

На додачу до стандартних арифметичних операцій (+, -, * /), JavaScript надає арифметичні операції, перечислені у наведеній нижче таблиці:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Арифметичні оператори
ОператорОписПриклад
Остача (%)Бінарний оператор. Повертає цілочисельну остачу від ділення двох операндів.12 % 5 повертає 2.
Інкремент (++)Унарний оператор. Додає до операнда одиницю. Якщо використовується як префіксний оператор (++x), повертає значення операнда після додавання одиниці; якщо використовується як постфіксний оператор (x++), повертає значення операнда перед додаванням одиниці.Якщо x дорівнює 3, тоді ++x присвоює x значення 4 та повертає 4, в той час, як x++ повертає 3 і лише тоді присвоює x значення 4.
Декремент (--)Унарний оператор. Віднімає одиницю від свого операнда. Повернене значення аналогічне поверненому значенню оператора інкременту.Якщо x дорівнює 3, тоді --x присвоює x значення 2 та повертає 2, в той час, як x-- повертає 3 і тільки тоді присвоює x значення 2.
Унарний мінус (-)Унарний оператор. Повертає операнд з протилежним знаком.Якщо x дорівнює 3, то -x повертає -3.
Унарний плюс (+)Унарний оператор. Намагається перетворити операнд на число, якщо він не є числом.+"3" повертає 3.
+ +true повертає 1.
Піднесення до степеня (**) {{experimental_inline}}Підносить основу степеня до показника степеня, тобто, основапоказник2 ** 3 повертає 8.
+ 10 ** -1 повертає 0.1.
+ +

Бітові оператори

+ +

Бітовий оператор опрацьовує свої операнди як послідовність 32-х бітів (нулів та одиниць), а не як десяткові, шістнадцяткові або вісімкові числа. Наприклад, десяткове число дев'ять має бітове представлення 1001. Бітові оператори виконують операції над цими бітовими представленнями, але повертають стандартні числові значення JavaScript.

+ +

Наступна таблиця наводить перелік бітових операторів JavaScript.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Бітові оператори
ОператорЗастосуванняОпис
Побітове І (AND)a & bПовертає одиницю на кожній позиції, де відповідні біти обох операндів дорівнюють одиницям.
Побітове АБО (OR)a | bПовертає нуль на кожній позиції, де відповідні біти обох операндів дорівнюють нулям.
Виключне побітове АБО (XOR)a ^ bПовертає нуль на кожній позиції, де відповідні біти однакові.
+ [Повертає один на кожній позиції, де відповідні біти мають різні значення.]
Побітове НЕ (NOT)~ aВиконує інверсію бітів операнду.
Лівий зсувa << bЗсуває a у двійковому представленні на b бітів ліворуч, заповнюючи позиції справа нулями.
Правий зсув з розширенням знакуa >> bЗсуває a у двійковому представленні на b бітів праворуч, відкидаючи зсунуті біти.
Правий зсув із заповненням нулямиa >>> bЗсуває a у двійковому представленні на b бітів праворуч, відкидаючи зсунуті біти та заповнюючи позиції зліва нулями.
+ +

Побітові логічні оператори

+ +

Концептуально побітові логічні оператори працюють наступним чином:

+ + + +

Наприклад, бінарним представленням числа дев'ять є 1001, а бінарним представленням п'ятнадцяти є 1111. Отже, коли бітові оператори застосовуються до цих величин, результати будуть наступні:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Приклади бітових операторів
ВиразРезультатДвійковий опис
15 & 991111 & 1001 = 1001
15 | 9151111 | 1001 = 1111
15 ^ 961111 ^ 1001 = 0110
~15-16~00000000...00001111 = 11111111...11110000
~9-10~00000000...00001001 = 11111111...11110110
+ +

Зауважте, що усі 32 біти інвертуються побітовим оператором НЕ, і що значення, в яких найстарший (перший зліва) біт дорівнює 1, відображають від'ємні числа (формат доповняльного коду).

+ +

Оператори бітового зсуву

+ +

Оператори бітового зсуву приймають два операнди: перший є величиною, в якій треба виконати зсув, а другий вказує кількість бітових позицій для зсуву. Напрямок операції зсуву контролюється застосованим оператором.

+ +

Оператори зсуву перетворюють свої операнди на 32-бітні цілі числа та повертають результат того самого типу, до якого належить лівий операнд.

+ +

Оператори зсуву наведені у наступній таблиці.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Оператори бітового зсуву
ОператорОписПриклад
Лівий зсув
+ (<<)
Цей оператор виконує зсув першого операнду на вказану кількість бітів ліворуч. Надлишкові біти, зсунуті ліворуч, відкидаються. Біти, додані справа, заповнюються нулями.9<<2 вертає 36, тому що число 1001, зсунуте на 2 біти ліворуч, стає 100100, тобто, 36.
Правий зсув з розширенням знаку (>>) +

Цей оператор виконує зсув першого операнду на вказану кількість бітів праворуч. Надлишкові біти, зсунуті праворуч, відкидаються. Біти, додані зліва, заповнюються значенням старшого біта.

+
9>>2 вертає 2, тому що число 1001, зсунуте на 2 біти праворуч, стає 10, тобто 2. Аналогічно, -9>>2 вертає -3,  тому що знак зберігається.
Правий зсув із заповненням нулями(>>>) +

Цей оператор виконує зсув першого операнду на вказану кількість бітів праворуч. Надлишкові біти, зсунуті праворуч, відкидаються. Біти, додані зліва, заповнюються нулями.

+
19>>>2 вертає 4, тому що число 10011, зсунуте на 2 бітів праворуч, стає 100, тобто 4. Для невід'ємних чисел, правий зсув із заповненням нулями та правий зсув з розширенням знаку дають однаковий результат.
+ +

Логічні оператори

+ +

Логічні оператори застосовуються до булевих (логічних) значень; в цьому випадку вони повертають значення типу Boolean. Однак, оператори && та || насправді повертають значення одного з заданих операндів, тому, якщо ці оператори використовуються зі значеннями не булевого типу, вони повернуть значення не булевого типу. Логічні оператори описані у наведеній нижче таблиці.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Логічні оператори
ОператорЗастосуванняОпис
Логічне І (&&)expr1 && expr2Вертає вираз expr1, якщо він може бути перетворений на false; інакше, повертає expr2. Таким чином, при використанні з булевими значеннями && вертає true, якщо обидва операнди дорівнюють true; інакше, вертає false.
Логічне АБО (||)expr1 || expr2Вертає вираз expr1, якщо він може бути перетворений на true; інакше, вертає expr2. Таким чином, при використанні з булевими значеннями || вертає true, якщо будь-який з операндів дорівнює true; якщо обидва дорівнюють false, вертає false.
Логічне НЕ (!)!exprВертає false, якщо його єдиний операнд може бути перетворений на true; інакше, вертає true.
+ +

Прикладами виразів, які можуть бути перетворені на false, є ті, які повертають null, 0, NaN, порожній рядок ("") або undefined.

+ +

Наступний код демонструє приклади оператора && (логічне І).

+ +
var a1 =  true && true;     // t && t вертає true
+var a2 =  true && false;    // t && f вертає false
+var a3 = false && true;     // f && t вертає false
+var a4 = false && (3 == 4); // f && f вертає false
+var a5 = 'Кіт' && 'Пес';    // t && t вертає Пес
+var a6 = false && 'Кіт';    // f && t вертає false
+var a7 = 'Кіт' && false;    // t && f вертає false
+
+ +

Наступний код демонструє приклади оператора || (логічне АБО).

+ +
var o1 =  true || true;     // t || t вертає true
+var o2 = false || true;     // f || t вертає true
+var o3 =  true || false;    // t || f вертає true
+var o4 = false || (3 == 4); // f || f вертає false
+var o5 = 'Кіт' || 'Пес';    // t || t вертає Кіт
+var o6 = false || 'Кіт';    // f || t вертає Кіт
+var o7 = 'Кіт' || false;    // t || f вертає Кіт
+
+ +

Наступний код демонструє приклади оператора ! (логічне НЕ).

+ +
var n1 = !true;  // !t вертає false
+var n2 = !false; // !f вертає true
+var n3 = !'Кіт'; // !t вертає false
+
+ +

Коротке замикання обчислення

+ +

Оскільки логічні вирази обчислюються зліва направо, вони перевіряються на можливе "коротке замикання" обчислення за наступними правилами:

+ + + +

Правила логіки гарантують, що ці обчислення завжди будуть правильними. Зауважте, що частина виразу будь-що не обчислюється, тому будь-які побічні ефекти від цих обчислень не відбудуться.

+ +

Рядкові оператори

+ +

На додачу до операторів порівняння, які можуть застосовуватись до рядкових значень, оператор конкатенації (+) об'єднує значення двох рядків, повертаючи інший рядок, який є об'єднанням рядків двох операндів.

+ +

Наприклад,

+ +
console.log('мій ' + 'рядок'); // консоль виводить рядок "мій рядок".
+ +

Скорочений оператор присвоєння += також може застосовуватись для конкатенації рядків.

+ +

Наприклад,

+ +
var mystring = 'алфа';
+mystring += 'віт'; // повертає "алфавіт" та присвоює це значення mystring.
+ +

Умовний (тернарний) оператор

+ +

Умовний оператор - єдиний оператор у JavaScript, який приймає три операнди. У оператора може бути одне чи два значення, в залежності від умови. Використовує наступний синтакс:

+ +
умова ? значення1 : значення2
+
+ +

Якщо умова дорівнює true, оператор повертає значення1.  В іншому випадку - значення2. Умовний оператор можна використовувати будь-де, де використовується звичайний оператор. Наприклад:

+ +
var status = (age >= 18) ? 'дорослий' : 'неповнолітній';
+
+ +

Ця інструкція присвоює значення "дорослий" змінній status, якщо значення age (вік) більше чи дорівнює 18. Інакше, вона присвоює змінній status значення "неповнолітній".

+ +

Оператор кома

+ +

Оператор кома (,) просто обчислює обидва свої операнди та повертає значення останнього операнда. Цей оператор найчастіше використовується всередині циклу for, що дозволяє оновлювати більше однієї змінної на кожному проході циклу.

+ +

Наприклад, якщо a є двовимірним масивом з 10 елементами по кожній стороні, наступний код використовує оператор кома, щоб оновити дві змінні одночасно. Код виводить значення діагональних елементів масиву:

+ +
for (var i = 0, j = 9; i <= j; i++, j--)
+  console.log('a[' + i + '][' + j + ']= ' + a[i][j]);
+
+ +

Унарні оператори

+ +

Унарна операція - це операція лише з одним операндом.

+ +

delete

+ +

Оператор delete видаляє об'єкт, властивість об'єкта або елемент за вказаним індексом у масиві. Синтаксис наступний:

+ +
delete objectName;
+delete objectName.property;
+delete objectName[index];
+delete property; // працює лише всередині конструкції with
+
+ +

де objectName є іменем об'єкта, property - існуюча властивість, а index - ціле число, що вказує розташування елемента у масиві.

+ +

Четверта форма працює лише всередині блоку with для видалення властивості об'єкта.

+ +

Ви можете використовувати оператор delete для видалення змінних, оголошених неявно, але не тих, що були оголошені оператором var.

+ +

Якщо оператор delete відпрацьовує успішно, значенням властивості чи елемента стає undefined. Оператор delete повертає true, якщо операція можлива; він повертає false, якщо операція неможлива.

+ +
x = 42;
+var y = 43;
+myobj = new Number();
+myobj.h = 4;    // створює властивість h
+delete x;       // вертає true (можна видалити властивість, оголошену неявно)
+delete y;       // вертає false (не можна видалити властивість, оголошену через var)
+delete Math.PI; // вертає false (не можна видаляти попередньо визначені властивості)
+delete myobj.h; // вертає true (можна видалити властивість, визначену користувачем)
+delete myobj;   // вертає true (можна видалити, якщо властивість оголошена неявно)
+
+ +
Видалення елементів масиву
+ +

Коли ви видаляєте елемент масиву, це не впливає на довжину масиву. Для прикладу, якщо ви видалите a[3], a[4] досі є a[4], а a[3] дорівнює undefined.

+ +

Коли оператор delete видаляє елемент масиву, цей елемент більше не існує у масиві. У наступному прикладі trees[3] видаляється оператором delete. Однак, адреса trees[3] досі доступна та повертає undefined.

+ +
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
+delete trees[3];
+if (3 in trees) {
+  // це не виконається
+}
+
+ +

Якщо вам потрібно, щоб елемент існував, але мав значення undefined, скористайтесь ключовим словом undefined замість оператора delete. У наступному прикладі trees[3] присвоюється значення undefined, але елемент масиву досі існує:

+ +
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
+trees[3] = undefined;
+if (3 in trees) {
+  // це виконається
+}
+
+ +

typeof

+ +

Оператор typeof використовується наступним чином:

+ +
typeof операнд
+typeof (операнд)
+
+ +

Оператор typeof повертає рядок, що вказує тип необчисленого операнда. Операнд є рядком, змінною, ключовим словом чи об'єктом, для якого треба повернути тип. Круглі дужки є необов'язковими.

+ +

Припустимо, ви визначили наступні змінні:

+ +
var myFun = new Function('5 + 2');
+var shape = 'коло';
+var size = 1;
+var foo = ['Яблуко', 'Манго', 'Апельсин'];
+var today = new Date();
+
+ +

Оператор typeof вертає наступні результати для цих змінних:

+ +
typeof myFun;       // вертає "function"
+typeof shape;       // вертає "string"
+typeof size;        // вертає "number"
+typeof foo;         // вертає "object"
+typeof today;       // вертає "object"
+typeof doesntExist; // вертає "undefined"
+
+ +

Для ключових слів true та null оператор typeof вертає наступні результати:

+ +
typeof true; // вертає "boolean"
+typeof null; // вертає "object"
+
+ +

Для числа та рядка оператор typeof вертає наступні результати:

+ +
typeof 62;            // вертає "number"
+typeof 'Hello world'; // вертає "string"
+
+ +

Для значень властивостей оператор typeof вертає тип значення, яке містить ця властивість:

+ +
typeof document.lastModified; // вертає "string"
+typeof window.length;         // вертає "number"
+typeof Math.LN2;              // вертає "number"
+
+ +

Для методів та функцій оператор typeof вертає наступні результати:

+ +
typeof blur;        // вертає "function"
+typeof eval;        // вертає "function"
+typeof parseInt;    // вертає "function"
+typeof shape.split; // вертає "function"
+
+ +

Для попередньо визначених об'єктів оператор typeof вертає наступні результати:

+ +
typeof Date;     // вертає "function"
+typeof Function; // вертає "function"
+typeof Math;     // вертає "object"
+typeof Option;   // вертає "function"
+typeof String;   // вертає "function"
+
+ +

void

+ +

Оператор void використовується наступним чином:

+ +
void (вираз)
+void вираз
+
+ +

Оператор void вказує, що вираз має бути обчислений без повернення значення. Вираз є виразом JavaScript, який треба обчислити. Дужки, що оточують вираз, є необов'язковими, але вживати їх є гарним стилем.

+ +

Ви можете скористатись оператором void, щоб вказати вираз як гіпертекстове посилання. Вираз обчислюється, але не завантажується на місці відкритого документа.

+ +

Наступний код створює гіпертекстове посилання, яке нічого не робить, коли користувач на нього натискає. Коли користувач натискає на посилання, void(0) обчислюється як undefined, що не має жодного ефекту у JavaScript.

+ +
<a href="javascript:void(0)">Натисніть сюди, щоб нічого не робити</a>
+
+ +

Наступний код створює гіпертекстове посилання, яке відправляє форму, коли користувач натискає на нього.

+ +
<a href="javascript:void(document.form.submit())">
+Натисніть сюди, щоб відправити</a>
+ +

Оператори відношення

+ +

Оператор відношення порівнює свої операнди та повертає значення Boolean, на підставі того, чи є порівняння істиною.

+ +

in

+ +

Оператор in повертає true, якщо вказана властивість існує на вказаному об'єкті. Синтаксис наступний:

+ +
propNameOrNumber in objectName
+
+ +

де propNameOrNumber є рядковим або числовим виразом, який відображає ім'я властивості або індекс у масиві, а objectName є ім'ям об'єкта.

+ +

Наступний приклад демонструє варіанти використання оператора in.

+ +
// Масиви
+var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
+0 in trees;        // вертає true
+3 in trees;        // вертає true
+6 in trees;        // вертає false
+'лавр' in trees;    // вертає false (ви маєте вказати індекс,
+                   // а не значення за цим індексом)
+'length' in trees; // вертає true (length є властивістю масиву)
+
+// вбудовані об'єкти
+'PI' in Math;          // вертає true
+var myString = new String('корал');
+'length' in myString;  // вертає true
+
+// Користувацькі об'єкти
+var mycar = { make: 'Honda', model: 'Accord', year: 1998 };
+'make' in mycar;  // вертає true
+'model' in mycar; // вертає true
+
+ +

instanceof

+ +

Оператор instanceof повертає true, якщо вказаний об'єкт належить до вказаного типу. Синтаксис наступний:

+ +
objectName instanceof objectType
+
+ +

де objectName є ім'ям об'єкта, який порівнюється з objectType, а objectType є типом об'єкта, наприклад, {{jsxref("Date")}} або {{jsxref("Array")}}.

+ +

Використовуйте instanceof, коли вам необхідно підтвердити тип об'єкта під час виконання. Наприклад, перехоплюючи винятки, ви можете зробити відгалуження до іншого коду обробки винятків, в залежності від типу викинутого винятку.

+ +

Наприклад, наступний код використовує instanceof для визначення того, чи theDay є об'єктом Date. Оскільки theDay є об'єктом Date, інструкції у блоці if будуть виконані.

+ +
var theDay = new Date(1995, 12, 17);
+if (theDay instanceof Date) {
+  // інструкції для виконання
+}
+
+ +

Пріоритет операторів

+ +

Пріоритет операторів визначає порядок, у якому вони застосовуються під час обчислення виразу. Ви можете змінити пріоритет оператора, використавши дужки.

+ +

Наступна таблиця наводить пріоритети операторів, від найвищого до найнижчого.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Пріоритет операторів
Тип оператораОкремі оператори
властивість. []
виклик / створення екземпляра() new
заперечення / інкремент! ~ - + ++ -- typeof void delete
множення / ділення* / %
додавання / віднімання+ -
бітовий зсув<< >> >>>
відношення< <= > >= in instanceof
рівність== != === !==
побітове-і&
виключне-побітове-або^
побітове-або|
логічне-і&&
логічне-або||
умовний?:
присвоєння= += -= *= /= %= <<= >>= >>>= &= ^= |=
кома,
+ +

Більш детальну версію цієї таблиці, доповнену посиланнями на додаткові подробиці щодо кожного оператора, можна знайти у довіднику з JavaScript.

+ +

Вирази

+ +

Виразом є будь-яка одиниця коду, яка вирішується з певним значенням.

+ +

Кожний синтаксично коректний вираз вирішується з якимось значенням, але, концептуально, існують два типи виразів: з побічними ефектами (наприклад: ті, що присвоюють значення змінній) та такі, що обчислюються і, таким чином, вирішуються з певним значенням.

+ +

Вираз x = 7 є прикладом першого типу. Цей вираз використовує оператор = для присвоєння семи змінній x. Сам вираз обчислюється з результатом сім.

+ +

Код 3 + 4 є прикладом другого типу виразів. Цей вираз за допомогою оператора + складає три та чотири без присвоєння результату, семи, змінній.
+
+ JavaScript має наступні категорії виразів:

+ + + +

Первинні вирази

+ +

Базові ключові слова та загальні вирази у JavaScript.

+ +

this

+ +

Використовуйте ключове слово this для посилання на поточний об'єкт. Загалом, this у методі посилається на об'єкт, що його викликав. Використовуйте this або з крапкою, або з дужковою нотацією:

+ +
this['propertyName']
+this.propertyName
+
+ +

Припустимо, функція на ім'я validate перевіряє властивість об'єкта value, маючи найменше та найбільше значення:

+ +
function validate(obj, lowval, hival) {
+  if ((obj.value < lowval) || (obj.value > hival))
+    console.log('Некоректне значення!');
+}
+
+ +

Ви можете викликати validate в кожному обробнику подій елементів форми onChange, використовуючи this, щоб передати йому елемент форми, як у наступному прикладі:

+ +
<p>Введіть число між 18 та 99:</p>
+<input type="текст" name="вік" size=3 onChange="validate(this, 18, 99);">
+
+ +

Оператор групування

+ +

Оператор групування ( ) контролює пріоритет обчислення у виразах. Наприклад, ви можете змінити обчислення спочатку множення та ділення, а потім додавання та віднімання, щоб обчислити спочатку додавання.

+ +
var a = 1;
+var b = 2;
+var c = 3;
+
+// пріоритет за замовчуванням
+a + b * c     // 7
+// обчислюється наступним чином
+a + (b * c)   // 7
+
+// тепер змінюємо пріоритет
+// додавання перед множенням
+(a + b) * c   // 9
+
+// що є рівнозначним
+a * c + b * c // 9
+
+ +

Лівосторонні вирази

+ +

Значення зліва є призначенням присвоєння.

+ +

new

+ +

Ви можете скористатись оператором new, щоб створити екземпляр визначеного користувачем типу об'єкта або одного з вбудованих типів. Використовуйте new наступним чином:

+ +
var objectName = new objectType([param1, param2, ..., paramN]);
+
+ +

super

+ +

Ключове слово super використовується для виклику функцій батьківського об'єкта. Воно корисне для використання з класами, для виклику батьківського конструктора, наприклад.

+ +
super([arguments]); // викликає батьківський конструктор.
+super.functionOnParent([arguments]);
+
+ +

Оператор розпакування

+ +

Оператор розпакування дозволяє розкласти вираз там, де очікується більше одного аргументу (для викликів функцій) або більше одного елемента (для масивних літералів).

+ +

Приклад: Сьогодні, якщо ви маєте масив та бажаєте створити новий масив, використавши існуючий масив як його частину, синтаксису масивного літералу більше недостатньо, і вам доводиться повертатись до імперативного коду, використовуючи комбінацію з push, splice, concat, і т. д. З оператором розпакування все стає набагато лаконічнішим:

+ +
var parts = ['плечі', 'коліна'];
+var lyrics = ['голова', ...parts, 'та', 'пальці'];
+ +

Схожим чином оператор розпакування працює з викликами функцій:

+ +
function f(x, y, z) { }
+var args = [0, 1, 2];
+f(...args);
+ +
{{PreviousNext("Web/JavaScript/Guide/Functions", "Web/JavaScript/Guide/Numbers_and_dates")}}
diff --git "a/files/uk/web/javascript/guide/\320\262\320\270\321\200\320\260\320\267\320\270_\321\202\320\260_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270/index.html" "b/files/uk/web/javascript/guide/\320\262\320\270\321\200\320\260\320\267\320\270_\321\202\320\260_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270/index.html" deleted file mode 100644 index fdfbc0659b..0000000000 --- "a/files/uk/web/javascript/guide/\320\262\320\270\321\200\320\260\320\267\320\270_\321\202\320\260_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270/index.html" +++ /dev/null @@ -1,925 +0,0 @@ ---- -title: Вирази та оператори -slug: Web/JavaScript/Guide/Вирази_та_оператори -tags: - - JavaScript - - Оператори - - Посібник - - вирази -translation_of: Web/JavaScript/Guide/Expressions_and_Operators ---- -
{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Functions", "Web/JavaScript/Guide/Numbers_and_dates")}}
- -

Цей розділ описує вирази та оператори JavaScript, такі як присвоювання, порівняння, арифметичні оператори, бітові, логічні, рядкові, тернарний та інші.

- -

Повний та детальний список операторів та виразів також доступний за посиланням.

- -

Оператори

- -

JavaScript має наступні типи операторів. Ця секція описує оператори, а також містить інформацію щодо їхніх пріоритетів.

- - - -

JavaScript має як бінарні, так і унарні оператори, а також один особливий тернарний оператор - умовний оператор. Бінарному оператору потрібні два операнди - один перед оператором, інший після оператора:

- -
операнд1 оператор операнд2
-
- -

Наприклад, 3+4 чи x*y.

- -

Унарний оператор потребує лише одного операнду до чи після оператора:

- -
оператор операнд
-
- -

чи

- -
операнд оператор
-
- -

Наприклад, x++ чи ++x.

- -

Оператори присвоєння

- -

Оператор присвоєння присвоює своєму лівому операнду значення на підставі значення правого операнда. Простим оператором присвоєння є оператор дорівнює (=), який присвоює значення свого правого операнда лівому операнду. Таким чином, x = y присвоює значення змінної y змінній x.

- -

Також існують складені оператори присвоєння, які є скороченнями для операцій, перелічених у наступній таблиці:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Складені оператори присвоювання
НазваОператор скороченого записуЗначення
Присвоєнняx = yx = y
Присвоєння з додаваннямx += yx = x + y
Присвоєння з відніманнямx -= yx = x - y
Присвоєння з множеннямx *= yx = x * y
Присвоєння з діленнямx /= yx = x / y
Присвоєння остачіx %= yx = x % y
Присвоєння з піднесенням до степеня{{experimental_inline}}x **= yx = x ** y
Присвоєння з лівим зсувомx <<= yx = x << y
Присвоєння з правим зсувомx >>= yx = x >> y
Присвоєння з беззнаковим правим зсувомx >>>= yx = x >>> y
Присвоєння з побітовим Іx &= yx = x & y
Присвоєння з виключним побітовим АБОx ^= yx = x ^ y
Присвоєння з побітовим АБОx |= yx = x | y
- -

Деструктуризація

- -

Для більш складних присвоювань використовується синтаксис деструктуризації. Це вираз JavaScript, який надає можливість витягувати дані з масивів та об'єктів, використовуючи синтаксис, що віддзеркалює конструкцію масивів та об'єктних літералів. 

- -
var foo = ['один', 'два', 'три'];
-
-// без деструктуризації
-var one   = foo[0];
-var two   = foo[1];
-var three = foo[2];
-
-// із деструктуризацією
-var [one, two, three] = foo;
-
- -

Оператори порівняння

- -

Оператор порівняння порівнює свої операнди та повертає логічне значення, базуючись на істинності порівняння. Операнди можуть бути числовими, рядковими, логічними значеннями або об'єктами. Рядки порівнюються згідно стандартного лексикографічного порядку, з використанням значень Unicode. У більшості випадків, якщо два операнди не належать до одного типу, JavaScript намагається привести їх до належного для порівняння типу. Зазвичай це призводить до числового порівняння операндів. Єдиними винятками у конвертації типів під час порівняння є оператори === та !==, які виконують перевірку на строгу рівність та строгу нерівність. Ці оператори не намагаються перед перевіркою на рівність привести операнди до спільного типу. Наступна таблиця наводить оператори порівняння у контексті цього фрагменту коду:

- -
var var1 = 3;
-var var2 = 4;
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Оператори порівняння
ОператорОписПриклади, які повертають true
Рівність (==)Повертає true, якщо оператори рівні.3 == var1 -

"3" == var1

- 3 == '3'
Нерівність (!=)Повертає true, якщо оператори нерівні.var1 != 4
- var2 != "3"
Строга рівність (===)Повертає true якщо оператори рівні та належать до одного типу. Дивіться також {{jsxref("Object.is")}} та однаковість у JS.3 === var1
Строга нерівність (!==)Повертає true, якщо оператори належать до одного типу, але нерівні, або належать до різних типів.var1 !== "3"
- 3 !== '3'
Більше ніж (>)Повертає true, якщо лівий операнд більший за правий.var2 > var1
- "12" > 2
Більше чи дорівнює (>=)Повертає true, якщо значення лівого операнда більше або дорівнює значенню правого операнда.var2 >= var1
- var1 >= 3
Менше ніж (<)Повертає true, якщо лівий операнд менший за правий.var1 < var2
- "2" < 12
Менше чи дорівнює (<=)Повертає true, якщо значення лівого операнда менше або дорівнює значенню правого операнда.var1 <= var2
- var2 <= 5
- -
-

Заувага: (=>) не оператор, а позначення для стрілкових функцій.

-
- -

Арифметичні оператори

- -

Арифметичний оператор приймає числові значення (літерали чи змінні) в якості операндів та повертає єдине числове значення. Стандартними арифметичними операторами є додавання (+), віднімання (-), множення (*) та ділення (/). Ці оператори працюють так само, як і в більшості інших мов програмування при використанні з числами з рухомою комою (зокрема, зауважте, що ділення на нуль повертає {{jsxref("Infinity")}}). Наприклад:

- -
1 / 2; // 0.5
-1 / 2 == 1.0 / 2.0; // це дорівнює true
-
- -

На додачу до стандартних арифметичних операцій (+, -, * /), JavaScript надає арифметичні операції, перечислені у наведеній нижче таблиці:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Арифметичні оператори
ОператорОписПриклад
Остача (%)Бінарний оператор. Повертає цілочисельну остачу від ділення двох операндів.12 % 5 повертає 2.
Інкремент (++)Унарний оператор. Додає до операнда одиницю. Якщо використовується як префіксний оператор (++x), повертає значення операнда після додавання одиниці; якщо використовується як постфіксний оператор (x++), повертає значення операнда перед додаванням одиниці.Якщо x дорівнює 3, тоді ++x присвоює x значення 4 та повертає 4, в той час, як x++ повертає 3 і лише тоді присвоює x значення 4.
Декремент (--)Унарний оператор. Віднімає одиницю від свого операнда. Повернене значення аналогічне поверненому значенню оператора інкременту.Якщо x дорівнює 3, тоді --x присвоює x значення 2 та повертає 2, в той час, як x-- повертає 3 і тільки тоді присвоює x значення 2.
Унарний мінус (-)Унарний оператор. Повертає операнд з протилежним знаком.Якщо x дорівнює 3, то -x повертає -3.
Унарний плюс (+)Унарний оператор. Намагається перетворити операнд на число, якщо він не є числом.+"3" повертає 3.
- +true повертає 1.
Піднесення до степеня (**) {{experimental_inline}}Підносить основу степеня до показника степеня, тобто, основапоказник2 ** 3 повертає 8.
- 10 ** -1 повертає 0.1.
- -

Бітові оператори

- -

Бітовий оператор опрацьовує свої операнди як послідовність 32-х бітів (нулів та одиниць), а не як десяткові, шістнадцяткові або вісімкові числа. Наприклад, десяткове число дев'ять має бітове представлення 1001. Бітові оператори виконують операції над цими бітовими представленнями, але повертають стандартні числові значення JavaScript.

- -

Наступна таблиця наводить перелік бітових операторів JavaScript.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Бітові оператори
ОператорЗастосуванняОпис
Побітове І (AND)a & bПовертає одиницю на кожній позиції, де відповідні біти обох операндів дорівнюють одиницям.
Побітове АБО (OR)a | bПовертає нуль на кожній позиції, де відповідні біти обох операндів дорівнюють нулям.
Виключне побітове АБО (XOR)a ^ bПовертає нуль на кожній позиції, де відповідні біти однакові.
- [Повертає один на кожній позиції, де відповідні біти мають різні значення.]
Побітове НЕ (NOT)~ aВиконує інверсію бітів операнду.
Лівий зсувa << bЗсуває a у двійковому представленні на b бітів ліворуч, заповнюючи позиції справа нулями.
Правий зсув з розширенням знакуa >> bЗсуває a у двійковому представленні на b бітів праворуч, відкидаючи зсунуті біти.
Правий зсув із заповненням нулямиa >>> bЗсуває a у двійковому представленні на b бітів праворуч, відкидаючи зсунуті біти та заповнюючи позиції зліва нулями.
- -

Побітові логічні оператори

- -

Концептуально побітові логічні оператори працюють наступним чином:

- - - -

Наприклад, бінарним представленням числа дев'ять є 1001, а бінарним представленням п'ятнадцяти є 1111. Отже, коли бітові оператори застосовуються до цих величин, результати будуть наступні:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Приклади бітових операторів
ВиразРезультатДвійковий опис
15 & 991111 & 1001 = 1001
15 | 9151111 | 1001 = 1111
15 ^ 961111 ^ 1001 = 0110
~15-16~00000000...00001111 = 11111111...11110000
~9-10~00000000...00001001 = 11111111...11110110
- -

Зауважте, що усі 32 біти інвертуються побітовим оператором НЕ, і що значення, в яких найстарший (перший зліва) біт дорівнює 1, відображають від'ємні числа (формат доповняльного коду).

- -

Оператори бітового зсуву

- -

Оператори бітового зсуву приймають два операнди: перший є величиною, в якій треба виконати зсув, а другий вказує кількість бітових позицій для зсуву. Напрямок операції зсуву контролюється застосованим оператором.

- -

Оператори зсуву перетворюють свої операнди на 32-бітні цілі числа та повертають результат того самого типу, до якого належить лівий операнд.

- -

Оператори зсуву наведені у наступній таблиці.

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Оператори бітового зсуву
ОператорОписПриклад
Лівий зсув
- (<<)
Цей оператор виконує зсув першого операнду на вказану кількість бітів ліворуч. Надлишкові біти, зсунуті ліворуч, відкидаються. Біти, додані справа, заповнюються нулями.9<<2 вертає 36, тому що число 1001, зсунуте на 2 біти ліворуч, стає 100100, тобто, 36.
Правий зсув з розширенням знаку (>>) -

Цей оператор виконує зсув першого операнду на вказану кількість бітів праворуч. Надлишкові біти, зсунуті праворуч, відкидаються. Біти, додані зліва, заповнюються значенням старшого біта.

-
9>>2 вертає 2, тому що число 1001, зсунуте на 2 біти праворуч, стає 10, тобто 2. Аналогічно, -9>>2 вертає -3,  тому що знак зберігається.
Правий зсув із заповненням нулями(>>>) -

Цей оператор виконує зсув першого операнду на вказану кількість бітів праворуч. Надлишкові біти, зсунуті праворуч, відкидаються. Біти, додані зліва, заповнюються нулями.

-
19>>>2 вертає 4, тому що число 10011, зсунуте на 2 бітів праворуч, стає 100, тобто 4. Для невід'ємних чисел, правий зсув із заповненням нулями та правий зсув з розширенням знаку дають однаковий результат.
- -

Логічні оператори

- -

Логічні оператори застосовуються до булевих (логічних) значень; в цьому випадку вони повертають значення типу Boolean. Однак, оператори && та || насправді повертають значення одного з заданих операндів, тому, якщо ці оператори використовуються зі значеннями не булевого типу, вони повернуть значення не булевого типу. Логічні оператори описані у наведеній нижче таблиці.

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Логічні оператори
ОператорЗастосуванняОпис
Логічне І (&&)expr1 && expr2Вертає вираз expr1, якщо він може бути перетворений на false; інакше, повертає expr2. Таким чином, при використанні з булевими значеннями && вертає true, якщо обидва операнди дорівнюють true; інакше, вертає false.
Логічне АБО (||)expr1 || expr2Вертає вираз expr1, якщо він може бути перетворений на true; інакше, вертає expr2. Таким чином, при використанні з булевими значеннями || вертає true, якщо будь-який з операндів дорівнює true; якщо обидва дорівнюють false, вертає false.
Логічне НЕ (!)!exprВертає false, якщо його єдиний операнд може бути перетворений на true; інакше, вертає true.
- -

Прикладами виразів, які можуть бути перетворені на false, є ті, які повертають null, 0, NaN, порожній рядок ("") або undefined.

- -

Наступний код демонструє приклади оператора && (логічне І).

- -
var a1 =  true && true;     // t && t вертає true
-var a2 =  true && false;    // t && f вертає false
-var a3 = false && true;     // f && t вертає false
-var a4 = false && (3 == 4); // f && f вертає false
-var a5 = 'Кіт' && 'Пес';    // t && t вертає Пес
-var a6 = false && 'Кіт';    // f && t вертає false
-var a7 = 'Кіт' && false;    // t && f вертає false
-
- -

Наступний код демонструє приклади оператора || (логічне АБО).

- -
var o1 =  true || true;     // t || t вертає true
-var o2 = false || true;     // f || t вертає true
-var o3 =  true || false;    // t || f вертає true
-var o4 = false || (3 == 4); // f || f вертає false
-var o5 = 'Кіт' || 'Пес';    // t || t вертає Кіт
-var o6 = false || 'Кіт';    // f || t вертає Кіт
-var o7 = 'Кіт' || false;    // t || f вертає Кіт
-
- -

Наступний код демонструє приклади оператора ! (логічне НЕ).

- -
var n1 = !true;  // !t вертає false
-var n2 = !false; // !f вертає true
-var n3 = !'Кіт'; // !t вертає false
-
- -

Коротке замикання обчислення

- -

Оскільки логічні вирази обчислюються зліва направо, вони перевіряються на можливе "коротке замикання" обчислення за наступними правилами:

- - - -

Правила логіки гарантують, що ці обчислення завжди будуть правильними. Зауважте, що частина виразу будь-що не обчислюється, тому будь-які побічні ефекти від цих обчислень не відбудуться.

- -

Рядкові оператори

- -

На додачу до операторів порівняння, які можуть застосовуватись до рядкових значень, оператор конкатенації (+) об'єднує значення двох рядків, повертаючи інший рядок, який є об'єднанням рядків двох операндів.

- -

Наприклад,

- -
console.log('мій ' + 'рядок'); // консоль виводить рядок "мій рядок".
- -

Скорочений оператор присвоєння += також може застосовуватись для конкатенації рядків.

- -

Наприклад,

- -
var mystring = 'алфа';
-mystring += 'віт'; // повертає "алфавіт" та присвоює це значення mystring.
- -

Умовний (тернарний) оператор

- -

Умовний оператор - єдиний оператор у JavaScript, який приймає три операнди. У оператора може бути одне чи два значення, в залежності від умови. Використовує наступний синтакс:

- -
умова ? значення1 : значення2
-
- -

Якщо умова дорівнює true, оператор повертає значення1.  В іншому випадку - значення2. Умовний оператор можна використовувати будь-де, де використовується звичайний оператор. Наприклад:

- -
var status = (age >= 18) ? 'дорослий' : 'неповнолітній';
-
- -

Ця інструкція присвоює значення "дорослий" змінній status, якщо значення age (вік) більше чи дорівнює 18. Інакше, вона присвоює змінній status значення "неповнолітній".

- -

Оператор кома

- -

Оператор кома (,) просто обчислює обидва свої операнди та повертає значення останнього операнда. Цей оператор найчастіше використовується всередині циклу for, що дозволяє оновлювати більше однієї змінної на кожному проході циклу.

- -

Наприклад, якщо a є двовимірним масивом з 10 елементами по кожній стороні, наступний код використовує оператор кома, щоб оновити дві змінні одночасно. Код виводить значення діагональних елементів масиву:

- -
for (var i = 0, j = 9; i <= j; i++, j--)
-  console.log('a[' + i + '][' + j + ']= ' + a[i][j]);
-
- -

Унарні оператори

- -

Унарна операція - це операція лише з одним операндом.

- -

delete

- -

Оператор delete видаляє об'єкт, властивість об'єкта або елемент за вказаним індексом у масиві. Синтаксис наступний:

- -
delete objectName;
-delete objectName.property;
-delete objectName[index];
-delete property; // працює лише всередині конструкції with
-
- -

де objectName є іменем об'єкта, property - існуюча властивість, а index - ціле число, що вказує розташування елемента у масиві.

- -

Четверта форма працює лише всередині блоку with для видалення властивості об'єкта.

- -

Ви можете використовувати оператор delete для видалення змінних, оголошених неявно, але не тих, що були оголошені оператором var.

- -

Якщо оператор delete відпрацьовує успішно, значенням властивості чи елемента стає undefined. Оператор delete повертає true, якщо операція можлива; він повертає false, якщо операція неможлива.

- -
x = 42;
-var y = 43;
-myobj = new Number();
-myobj.h = 4;    // створює властивість h
-delete x;       // вертає true (можна видалити властивість, оголошену неявно)
-delete y;       // вертає false (не можна видалити властивість, оголошену через var)
-delete Math.PI; // вертає false (не можна видаляти попередньо визначені властивості)
-delete myobj.h; // вертає true (можна видалити властивість, визначену користувачем)
-delete myobj;   // вертає true (можна видалити, якщо властивість оголошена неявно)
-
- -
Видалення елементів масиву
- -

Коли ви видаляєте елемент масиву, це не впливає на довжину масиву. Для прикладу, якщо ви видалите a[3], a[4] досі є a[4], а a[3] дорівнює undefined.

- -

Коли оператор delete видаляє елемент масиву, цей елемент більше не існує у масиві. У наступному прикладі trees[3] видаляється оператором delete. Однак, адреса trees[3] досі доступна та повертає undefined.

- -
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
-delete trees[3];
-if (3 in trees) {
-  // це не виконається
-}
-
- -

Якщо вам потрібно, щоб елемент існував, але мав значення undefined, скористайтесь ключовим словом undefined замість оператора delete. У наступному прикладі trees[3] присвоюється значення undefined, але елемент масиву досі існує:

- -
var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
-trees[3] = undefined;
-if (3 in trees) {
-  // це виконається
-}
-
- -

typeof

- -

Оператор typeof використовується наступним чином:

- -
typeof операнд
-typeof (операнд)
-
- -

Оператор typeof повертає рядок, що вказує тип необчисленого операнда. Операнд є рядком, змінною, ключовим словом чи об'єктом, для якого треба повернути тип. Круглі дужки є необов'язковими.

- -

Припустимо, ви визначили наступні змінні:

- -
var myFun = new Function('5 + 2');
-var shape = 'коло';
-var size = 1;
-var foo = ['Яблуко', 'Манго', 'Апельсин'];
-var today = new Date();
-
- -

Оператор typeof вертає наступні результати для цих змінних:

- -
typeof myFun;       // вертає "function"
-typeof shape;       // вертає "string"
-typeof size;        // вертає "number"
-typeof foo;         // вертає "object"
-typeof today;       // вертає "object"
-typeof doesntExist; // вертає "undefined"
-
- -

Для ключових слів true та null оператор typeof вертає наступні результати:

- -
typeof true; // вертає "boolean"
-typeof null; // вертає "object"
-
- -

Для числа та рядка оператор typeof вертає наступні результати:

- -
typeof 62;            // вертає "number"
-typeof 'Hello world'; // вертає "string"
-
- -

Для значень властивостей оператор typeof вертає тип значення, яке містить ця властивість:

- -
typeof document.lastModified; // вертає "string"
-typeof window.length;         // вертає "number"
-typeof Math.LN2;              // вертає "number"
-
- -

Для методів та функцій оператор typeof вертає наступні результати:

- -
typeof blur;        // вертає "function"
-typeof eval;        // вертає "function"
-typeof parseInt;    // вертає "function"
-typeof shape.split; // вертає "function"
-
- -

Для попередньо визначених об'єктів оператор typeof вертає наступні результати:

- -
typeof Date;     // вертає "function"
-typeof Function; // вертає "function"
-typeof Math;     // вертає "object"
-typeof Option;   // вертає "function"
-typeof String;   // вертає "function"
-
- -

void

- -

Оператор void використовується наступним чином:

- -
void (вираз)
-void вираз
-
- -

Оператор void вказує, що вираз має бути обчислений без повернення значення. Вираз є виразом JavaScript, який треба обчислити. Дужки, що оточують вираз, є необов'язковими, але вживати їх є гарним стилем.

- -

Ви можете скористатись оператором void, щоб вказати вираз як гіпертекстове посилання. Вираз обчислюється, але не завантажується на місці відкритого документа.

- -

Наступний код створює гіпертекстове посилання, яке нічого не робить, коли користувач на нього натискає. Коли користувач натискає на посилання, void(0) обчислюється як undefined, що не має жодного ефекту у JavaScript.

- -
<a href="javascript:void(0)">Натисніть сюди, щоб нічого не робити</a>
-
- -

Наступний код створює гіпертекстове посилання, яке відправляє форму, коли користувач натискає на нього.

- -
<a href="javascript:void(document.form.submit())">
-Натисніть сюди, щоб відправити</a>
- -

Оператори відношення

- -

Оператор відношення порівнює свої операнди та повертає значення Boolean, на підставі того, чи є порівняння істиною.

- -

in

- -

Оператор in повертає true, якщо вказана властивість існує на вказаному об'єкті. Синтаксис наступний:

- -
propNameOrNumber in objectName
-
- -

де propNameOrNumber є рядковим або числовим виразом, який відображає ім'я властивості або індекс у масиві, а objectName є ім'ям об'єкта.

- -

Наступний приклад демонструє варіанти використання оператора in.

- -
// Масиви
-var trees = ['секвоя', 'лавр', 'кедр', 'дуб', 'клен'];
-0 in trees;        // вертає true
-3 in trees;        // вертає true
-6 in trees;        // вертає false
-'лавр' in trees;    // вертає false (ви маєте вказати індекс,
-                   // а не значення за цим індексом)
-'length' in trees; // вертає true (length є властивістю масиву)
-
-// вбудовані об'єкти
-'PI' in Math;          // вертає true
-var myString = new String('корал');
-'length' in myString;  // вертає true
-
-// Користувацькі об'єкти
-var mycar = { make: 'Honda', model: 'Accord', year: 1998 };
-'make' in mycar;  // вертає true
-'model' in mycar; // вертає true
-
- -

instanceof

- -

Оператор instanceof повертає true, якщо вказаний об'єкт належить до вказаного типу. Синтаксис наступний:

- -
objectName instanceof objectType
-
- -

де objectName є ім'ям об'єкта, який порівнюється з objectType, а objectType є типом об'єкта, наприклад, {{jsxref("Date")}} або {{jsxref("Array")}}.

- -

Використовуйте instanceof, коли вам необхідно підтвердити тип об'єкта під час виконання. Наприклад, перехоплюючи винятки, ви можете зробити відгалуження до іншого коду обробки винятків, в залежності від типу викинутого винятку.

- -

Наприклад, наступний код використовує instanceof для визначення того, чи theDay є об'єктом Date. Оскільки theDay є об'єктом Date, інструкції у блоці if будуть виконані.

- -
var theDay = new Date(1995, 12, 17);
-if (theDay instanceof Date) {
-  // інструкції для виконання
-}
-
- -

Пріоритет операторів

- -

Пріоритет операторів визначає порядок, у якому вони застосовуються під час обчислення виразу. Ви можете змінити пріоритет оператора, використавши дужки.

- -

Наступна таблиця наводить пріоритети операторів, від найвищого до найнижчого.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Пріоритет операторів
Тип оператораОкремі оператори
властивість. []
виклик / створення екземпляра() new
заперечення / інкремент! ~ - + ++ -- typeof void delete
множення / ділення* / %
додавання / віднімання+ -
бітовий зсув<< >> >>>
відношення< <= > >= in instanceof
рівність== != === !==
побітове-і&
виключне-побітове-або^
побітове-або|
логічне-і&&
логічне-або||
умовний?:
присвоєння= += -= *= /= %= <<= >>= >>>= &= ^= |=
кома,
- -

Більш детальну версію цієї таблиці, доповнену посиланнями на додаткові подробиці щодо кожного оператора, можна знайти у довіднику з JavaScript.

- -

Вирази

- -

Виразом є будь-яка одиниця коду, яка вирішується з певним значенням.

- -

Кожний синтаксично коректний вираз вирішується з якимось значенням, але, концептуально, існують два типи виразів: з побічними ефектами (наприклад: ті, що присвоюють значення змінній) та такі, що обчислюються і, таким чином, вирішуються з певним значенням.

- -

Вираз x = 7 є прикладом першого типу. Цей вираз використовує оператор = для присвоєння семи змінній x. Сам вираз обчислюється з результатом сім.

- -

Код 3 + 4 є прикладом другого типу виразів. Цей вираз за допомогою оператора + складає три та чотири без присвоєння результату, семи, змінній.
-
- JavaScript має наступні категорії виразів:

- - - -

Первинні вирази

- -

Базові ключові слова та загальні вирази у JavaScript.

- -

this

- -

Використовуйте ключове слово this для посилання на поточний об'єкт. Загалом, this у методі посилається на об'єкт, що його викликав. Використовуйте this або з крапкою, або з дужковою нотацією:

- -
this['propertyName']
-this.propertyName
-
- -

Припустимо, функція на ім'я validate перевіряє властивість об'єкта value, маючи найменше та найбільше значення:

- -
function validate(obj, lowval, hival) {
-  if ((obj.value < lowval) || (obj.value > hival))
-    console.log('Некоректне значення!');
-}
-
- -

Ви можете викликати validate в кожному обробнику подій елементів форми onChange, використовуючи this, щоб передати йому елемент форми, як у наступному прикладі:

- -
<p>Введіть число між 18 та 99:</p>
-<input type="текст" name="вік" size=3 onChange="validate(this, 18, 99);">
-
- -

Оператор групування

- -

Оператор групування ( ) контролює пріоритет обчислення у виразах. Наприклад, ви можете змінити обчислення спочатку множення та ділення, а потім додавання та віднімання, щоб обчислити спочатку додавання.

- -
var a = 1;
-var b = 2;
-var c = 3;
-
-// пріоритет за замовчуванням
-a + b * c     // 7
-// обчислюється наступним чином
-a + (b * c)   // 7
-
-// тепер змінюємо пріоритет
-// додавання перед множенням
-(a + b) * c   // 9
-
-// що є рівнозначним
-a * c + b * c // 9
-
- -

Лівосторонні вирази

- -

Значення зліва є призначенням присвоєння.

- -

new

- -

Ви можете скористатись оператором new, щоб створити екземпляр визначеного користувачем типу об'єкта або одного з вбудованих типів. Використовуйте new наступним чином:

- -
var objectName = new objectType([param1, param2, ..., paramN]);
-
- -

super

- -

Ключове слово super використовується для виклику функцій батьківського об'єкта. Воно корисне для використання з класами, для виклику батьківського конструктора, наприклад.

- -
super([arguments]); // викликає батьківський конструктор.
-super.functionOnParent([arguments]);
-
- -

Оператор розпакування

- -

Оператор розпакування дозволяє розкласти вираз там, де очікується більше одного аргументу (для викликів функцій) або більше одного елемента (для масивних літералів).

- -

Приклад: Сьогодні, якщо ви маєте масив та бажаєте створити новий масив, використавши існуючий масив як його частину, синтаксису масивного літералу більше недостатньо, і вам доводиться повертатись до імперативного коду, використовуючи комбінацію з push, splice, concat, і т. д. З оператором розпакування все стає набагато лаконічнішим:

- -
var parts = ['плечі', 'коліна'];
-var lyrics = ['голова', ...parts, 'та', 'пальці'];
- -

Схожим чином оператор розпакування працює з викликами функцій:

- -
function f(x, y, z) { }
-var args = [0, 1, 2];
-f(...args);
- -
{{PreviousNext("Web/JavaScript/Guide/Functions", "Web/JavaScript/Guide/Numbers_and_dates")}}
diff --git a/files/uk/web/javascript/javascript_technologies_overview/index.html b/files/uk/web/javascript/javascript_technologies_overview/index.html new file mode 100644 index 0000000000..cb9564fe7b --- /dev/null +++ b/files/uk/web/javascript/javascript_technologies_overview/index.html @@ -0,0 +1,87 @@ +--- +title: Огляд технологій JavaScript +slug: Web/JavaScript/oglyad_tehnologiy_JavaScript +translation_of: Web/JavaScript/JavaScript_technologies_overview +--- +
{{JsSidebar("Introductory")}}
+ +

Introduction

+ +

Whereas HTML defines a webpage's structure and content and CSS sets the formatting and appearance, JavaScript adds interactivity to a webpage and creates rich web applications.

+ +

However, the umbrella term "JavaScript" as understood in a web browser context contains several very different elements. One of them is the core language (ECMAScript), another is the collection of the Web APIs, including the DOM (Document Object Model).

+ +

JavaScript, the core language (ECMAScript)

+ +

The core language of JavaScript is standardized by the ECMA TC39 committee as a language named ECMAScript.

+ +

This core language is also used in non-browser environments, for example in node.js.

+ +

What falls under the ECMAScript scope?

+ +

Among other things, ECMAScript defines:

+ + + +

Browser support

+ +

As of October 2016, the current versions of the major Web browsers implement ECMAScript 5.1 and ECMAScript 2015, but older versions (still in use) implement ECMAScript 5 only.

+ +

Future

+ +

The major 6th Edition of ECMAScript was officially approved and published as a standard on June 17, 2015 by the ECMA General Assembly. Since then ECMAScript Editions are published on a yearly basis.

+ +

Internationalization API

+ +

The ECMAScript Internationalization API Specification is an addition to the ECMAScript Language Specification, also standardized by Ecma TC39. The internationalization API provides collation (string comparison), number formatting, and date-and-time formatting for JavaScript applications, letting the applications choose the language and tailor the functionality to their needs. The initial standard was approved in December 2012; the status of implementations in browsers is tracked in the documentation of the Intl object. The Internationalization specification is nowadays also ratified on a yearly basis and browsers constantly improve their implementation.

+ +

DOM APIs

+ +

WebIDL

+ +

The WebIDL specification provides the glue between the DOM technologies and ECMAScript.

+ +

The Core of the DOM

+ +

The Document Object Model (DOM) is a cross-platform, language-independent convention for representing and interacting with objects in HTML, XHTML and XML documents. Objects in the DOM tree may be addressed and manipulated by using methods on the objects. The {{glossary("W3C")}} standardizes the Core Document Object Model, which defines language-agnostic interfaces that abstract HTML and XML documents as objects, and also defines mechanisms to manipulate this abstraction. Among the things defined by the DOM, we can find:

+ + + +

From the ECMAScript point of view, objects defined in the DOM specification are called "host objects".

+ +

HTML DOM

+ +

HTML, the Web's markup language, is specified in terms of the DOM. Layered above the abstract concepts defined in DOM Core, HTML also defines the meaning of elements. The HTML DOM includes such things as the className property on HTML elements, or APIs such as {{ domxref("document.body") }}.

+ +

The HTML specification also defines restrictions on documents; for example, it requires all children of a ul element, which represents an unordered list, to be li elements, as those represent list items. In general, it also forbids using elements and attributes that aren't defined in a standard.

+ +

Looking for the Document object, Window object, and the other DOM elements? Read the DOM documentation.

+ +

Other notable APIs

+ + + +

Browser support

+ +

As every web developer has experienced, the DOM is a mess. Browser support uniformity varies a lot from feature to feature, mainly because many important DOM features have very unclear, specifications (if any), and different web browsers add incompatible features for overlapping use cases (like the Internet Explorer event model). As of June 2011, the W3C and particularly the WHATWG are defining older features in detail to improve interoperability, and browsers in turn can improve their implementations based on these specifications.

+ +

One common, though perhaps not the most reliable, approach to cross-browser compatibility is to use JavaScript libraries, which abstract DOM features and keep their APIs working the same in different browsers. Some of the most widely used frameworks are jQuery, prototype, and YUI.

diff --git a/files/uk/web/javascript/oglyad_tehnologiy_javascript/index.html b/files/uk/web/javascript/oglyad_tehnologiy_javascript/index.html deleted file mode 100644 index cb9564fe7b..0000000000 --- a/files/uk/web/javascript/oglyad_tehnologiy_javascript/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Огляд технологій JavaScript -slug: Web/JavaScript/oglyad_tehnologiy_JavaScript -translation_of: Web/JavaScript/JavaScript_technologies_overview ---- -
{{JsSidebar("Introductory")}}
- -

Introduction

- -

Whereas HTML defines a webpage's structure and content and CSS sets the formatting and appearance, JavaScript adds interactivity to a webpage and creates rich web applications.

- -

However, the umbrella term "JavaScript" as understood in a web browser context contains several very different elements. One of them is the core language (ECMAScript), another is the collection of the Web APIs, including the DOM (Document Object Model).

- -

JavaScript, the core language (ECMAScript)

- -

The core language of JavaScript is standardized by the ECMA TC39 committee as a language named ECMAScript.

- -

This core language is also used in non-browser environments, for example in node.js.

- -

What falls under the ECMAScript scope?

- -

Among other things, ECMAScript defines:

- - - -

Browser support

- -

As of October 2016, the current versions of the major Web browsers implement ECMAScript 5.1 and ECMAScript 2015, but older versions (still in use) implement ECMAScript 5 only.

- -

Future

- -

The major 6th Edition of ECMAScript was officially approved and published as a standard on June 17, 2015 by the ECMA General Assembly. Since then ECMAScript Editions are published on a yearly basis.

- -

Internationalization API

- -

The ECMAScript Internationalization API Specification is an addition to the ECMAScript Language Specification, also standardized by Ecma TC39. The internationalization API provides collation (string comparison), number formatting, and date-and-time formatting for JavaScript applications, letting the applications choose the language and tailor the functionality to their needs. The initial standard was approved in December 2012; the status of implementations in browsers is tracked in the documentation of the Intl object. The Internationalization specification is nowadays also ratified on a yearly basis and browsers constantly improve their implementation.

- -

DOM APIs

- -

WebIDL

- -

The WebIDL specification provides the glue between the DOM technologies and ECMAScript.

- -

The Core of the DOM

- -

The Document Object Model (DOM) is a cross-platform, language-independent convention for representing and interacting with objects in HTML, XHTML and XML documents. Objects in the DOM tree may be addressed and manipulated by using methods on the objects. The {{glossary("W3C")}} standardizes the Core Document Object Model, which defines language-agnostic interfaces that abstract HTML and XML documents as objects, and also defines mechanisms to manipulate this abstraction. Among the things defined by the DOM, we can find:

- - - -

From the ECMAScript point of view, objects defined in the DOM specification are called "host objects".

- -

HTML DOM

- -

HTML, the Web's markup language, is specified in terms of the DOM. Layered above the abstract concepts defined in DOM Core, HTML also defines the meaning of elements. The HTML DOM includes such things as the className property on HTML elements, or APIs such as {{ domxref("document.body") }}.

- -

The HTML specification also defines restrictions on documents; for example, it requires all children of a ul element, which represents an unordered list, to be li elements, as those represent list items. In general, it also forbids using elements and attributes that aren't defined in a standard.

- -

Looking for the Document object, Window object, and the other DOM elements? Read the DOM documentation.

- -

Other notable APIs

- - - -

Browser support

- -

As every web developer has experienced, the DOM is a mess. Browser support uniformity varies a lot from feature to feature, mainly because many important DOM features have very unclear, specifications (if any), and different web browsers add incompatible features for overlapping use cases (like the Internet Explorer event model). As of June 2011, the W3C and particularly the WHATWG are defining older features in detail to improve interoperability, and browsers in turn can improve their implementations based on these specifications.

- -

One common, though perhaps not the most reliable, approach to cross-browser compatibility is to use JavaScript libraries, which abstract DOM features and keep their APIs working the same in different browsers. Some of the most widely used frameworks are jQuery, prototype, and YUI.

diff --git a/files/uk/web/javascript/reference/functions/arrow_functions/index.html b/files/uk/web/javascript/reference/functions/arrow_functions/index.html new file mode 100644 index 0000000000..f1638d8d84 --- /dev/null +++ b/files/uk/web/javascript/reference/functions/arrow_functions/index.html @@ -0,0 +1,362 @@ +--- +title: Стрілкові функції +slug: Web/JavaScript/Reference/Functions/Стрілкові_функції +translation_of: Web/JavaScript/Reference/Functions/Arrow_functions +--- +
{{jsSidebar("Functions")}}
+ +

Вирази стрілкових функцій мають більш короткий синтаксис, аніж функціональні вирази і не мають свого власного this, arguments, super, і new.target. Вони не можуть бути використані як конструктор і завжди анонімні.

+ +

Синтаксис

+ +

Basic Syntax

+ +
(параметр1,параметр2, …, параметрN) => { оператори }
+(параметр1, параметр2, …, параметрN) => вираз
+// еквівалентно до запису: (параметр1,параметр2, …, параметрN) => { return вираз; }
+
+// Якщо у функції тільки один параметр, то дужки не обов'язкові:
+(параметр) => { оператори }
+параметр => { оператори }
+параметр => вираз
+
+
+// Список параметрів для функції без параметрів повинен бути записаний у парі фігурних дужок.
+() => { оператори }
+
+ +

Advanced Syntax

+ +
// Візьміть тіло функції у дужки, якщо вона повертає об'єкт
+params => ({foo: bar})
+
+// Залишкові параметри та параметри за замовчуванням підтримуються як і в звичайних функціях
+(параметр1, параметр2, ...залишкові параметри) => { оператори }
+(параметр1 = значення_за_замовчуванням, параметр2, …, параметрN = значення_за_замовчуваннямN) => { оператори }
+
+// Деструктиризація в списку параметрів також підтримується:
+let f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
+f();
+// 6
+
+ +

Опис

+ +

Див. також "ES6 In Depth: Arrow functions" on hacks.mozilla.org.

+ +

Появу стрілкових функцій зумовили два фактори: можливість більш короткого запису і випадки, коли сутність this не обов'язкова.

+ +

Коротший запис

+ +
var materials = [
+  'Hydrogen',
+  'Helium',
+  'Lithium',
+  'Beryllium'
+];
+
+materials.map(function(material) {
+  return material.length;
+}); // [8, 6, 7, 9]
+
+materials.map((material) => {
+  return material.length;
+}); // [8, 6, 7, 9]
+
+materials.map(material => material.length); // [8, 6, 7, 9]
+
+ +

Спільний this

+ +

До появи стрілкових функцій кожна нова функція мала власне значення this :

+ + + +

Це все було далеким від ідеалів об'єктно-орієнтованого програмування.

+ +
function Person() {
+  // The Person() constructor defines `this` as an instance of itself.
+  this.age = 0;
+
+  setInterval(function growUp() {
+    // In non-strict mode, the growUp() function defines `this`
+    // as the global object, which is different from the `this`
+    // defined by the Person() constructor.
+    this.age++;
+  }, 1000);
+}
+
+var p = new Person();
+ +

В ECMAScript 3/5 ця проблема вирішувалась шляхом присвоєння значення this змінній, оголошеній всередині функції.

+ +
function Person() {
+  var that = this;
+  that.age = 0;
+
+  setInterval(function growUp() {
+    // The callback refers to the `that` variable of which
+    // the value is the expected object.
+    that.age++;
+  }, 1000);
+}
+ +

Або можна створити bound function (прив'язану функцію), в яку передати значення this для функції (функція growUp() в прикладі вище).

+ +

Стрілкова функція не має власного контексту this, а використовує this з контексту вище. Тому в коді, наведеному нижче, this для функції setInterval має таке ж значення, як і this зовнішньої функції:

+ +
function Person(){
+  this.age = 0;
+
+  setInterval(() => {
+    this.age++; // |this| properly refers to the person object
+  }, 1000);
+}
+
+var p = new Person();
+ +

Relation with strict mode

+ +

Given that this comes from the surrounding lexical context, strict mode rules with regard to this are ignored.

+ +
var f = () => { 'use strict'; return this; };
+f() === window; // or the global object
+ +

All other strict mode rules apply normally.

+ +

Invoked through call or apply

+ +

Since arrow functions do not have their own this, the methods call() or apply() can only pass in parameters. thisArg is ignored.

+ +
var adder = {
+  base: 1,
+
+  add: function(a) {
+    var f = v => v + this.base;
+    return f(a);
+  },
+
+  addThruCall: function(a) {
+    var f = v => v + this.base;
+    var b = {
+      base: 2
+    };
+
+    return f.call(b, a);
+  }
+};
+
+console.log(adder.add(1));         // This would log to 2
+console.log(adder.addThruCall(1)); // This would log to 2 still
+ +

No binding of arguments

+ +

Arrow functions do not have their own arguments object. Thus, in this example, arguments is simply a reference to the arguments of the enclosing scope:

+ +
var arguments = [1, 2, 3];
+var arr = () => arguments[0];
+
+arr(); // 1
+
+function foo(n) {
+  var f = () => arguments[0] + n; // foo's implicit arguments binding. arguments[0] is n
+  return f(10);
+}
+
+foo(1); // 2
+ +

In most cases, using rest parameters is a good alternative to using an arguments object.

+ +
function foo(n) {
+  var f = (...args) => args[0] + n;
+  return f(10);
+}
+
+foo(1); // 11
+ +

Arrow functions used as methods

+ +

As stated previously, arrow function expressions are best suited for non-method functions. Let's see what happens when we try to use them as methods:

+ +
'use strict';
+var obj = {
+  i: 10,
+  b: () => console.log(this.i, this),
+  c: function() {
+    console.log(this.i, this);
+  }
+}
+obj.b(); // prints undefined, Window {...} (or the global object)
+obj.c(); // prints 10, Object {...}
+ +

Arrow functions do not have their own this. Another example involving {{jsxref("Object.defineProperty()")}}:

+ +
'use strict';
+var obj = {
+  a: 10
+};
+
+Object.defineProperty(obj, 'b', {
+  get: () => {
+    console.log(this.a, typeof this.a, this);
+    return this.a + 10; // represents global object 'Window', therefore 'this.a' returns 'undefined'
+  }
+});
+
+ +

Use of the new operator

+ +

Arrow functions cannot be used as constructors and will throw an error when used with new.

+ +
var Foo = () => {};
+var foo = new Foo(); // TypeError: Foo is not a constructor
+ +

Use of prototype property

+ +

Arrow functions do not have a prototype property.

+ +
var Foo = () => {};
+console.log(Foo.prototype); // undefined
+
+ +

Use of the yield keyword

+ +

The yield keyword may not be used in an arrow function's body (except when permitted within functions further nested within it). As a consequence, arrow functions cannot be used as generators.

+ +

Тіло функції

+ +

Arrow functions can have either a "concise body" or the usual "block body".

+ +

In a concise body, only an expression is specified, which becomes the explicit return value. In a block body, you must use an explicit return statement.

+ +
var func = x => x * x;
+// concise body syntax, implied "return"
+
+var func = (x, y) => { return x + y; };
+// with block body, explicit "return" needed
+
+ +

Повернення літерала об'єкта

+ +

Keep in mind that returning object literals using the concise body syntax params => {object:literal} will not work as expected.

+ +
var func = () => { foo: 1 };
+// Calling func() returns undefined!
+
+var func = () => { foo: function() {} };
+// SyntaxError: function statement requires a name
+ +

This is because the code inside braces ({}) is parsed as a sequence of statements (i.e. foo is treated like a label, not a key in an object literal).

+ +

Remember to wrap the object literal in parentheses.

+ +
var func = () => ({foo: 1});
+ +

Розрив рядка

+ +

An arrow function cannot contain a line break between its parameters and its arrow.

+ +
var func = ()
+           => 1;
+// SyntaxError: expected expression, got '=>'
+ +

Порядок розбору

+ +

Although the arrow in an arrow function is not an operator, arrow functions have special parsing rules that interact differently with operator precedence compared to regular functions.

+ +
let callback;
+
+callback = callback || function() {}; // ok
+
+callback = callback || () => {};
+// SyntaxError: invalid arrow-function arguments
+
+callback = callback || (() => {});    // ok
+
+ +

Ще приклади

+ +
// An empty arrow function returns undefined
+let empty = () => {};
+
+(() => 'foobar')();
+// Returns "foobar"
+// (this is an Immediately Invoked Function Expression
+// see 'IIFE' in glossary)
+
+var simple = a => a > 15 ? 15 : a;
+simple(16); // 15
+simple(10); // 10
+
+let max = (a, b) => a > b ? a : b;
+
+// Easy array filtering, mapping, ...
+
+var arr = [5, 6, 13, 0, 1, 18, 23];
+
+var sum = arr.reduce((a, b) => a + b);
+// 66
+
+var even = arr.filter(v => v % 2 == 0);
+// [6, 0, 18]
+
+var double = arr.map(v => v * 2);
+// [10, 12, 26, 0, 2, 36, 46]
+
+// More concise promise chains
+promise.then(a => {
+  // ...
+}).then(b => {
+  // ...
+});
+
+// Parameterless arrow functions that are visually easier to parse
+setTimeout( () => {
+  console.log('I happen sooner');
+  setTimeout( () => {
+    // deeper code
+    console.log('I happen later');
+  }, 1);
+}, 1);
+
+ +

Специфікації

+ + + + + + + + + + + + + + + + + + + +
СпецифікаціяСтатусКоментар
{{SpecName('ES2015', '#sec-arrow-function-definitions', 'Arrow Function Definitions')}}{{Spec2('ES2015')}}Початкова виознака.
{{SpecName('ESDraft', '#sec-arrow-function-definitions', 'Arrow Function Definitions')}}{{Spec2('ESDraft')}}
+ +

Підтримка веб-переглядачами

+ +
+ + +

{{Compat("javascript.functions.arrow_functions")}}

+
+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/functions/rest_parameters/index.html b/files/uk/web/javascript/reference/functions/rest_parameters/index.html new file mode 100644 index 0000000000..f117aecc60 --- /dev/null +++ b/files/uk/web/javascript/reference/functions/rest_parameters/index.html @@ -0,0 +1,211 @@ +--- +title: Залишкові параметри +slug: Web/JavaScript/Reference/Functions/решта_параметрів +tags: + - JavaScript + - Rest + - параметри + - функції +translation_of: Web/JavaScript/Reference/Functions/rest_parameters +--- +
{{jsSidebar("Functions")}}
+ +
Синтаксис залишкових параметрів дозволяє представити невизначену кількість аргументів у вигляді масиву.
+ +
+ +

{{EmbedInteractiveExample("pages/js/functions-restparameters.html")}}

+ + + +

Синтаксис

+ +
function f(a, b, ...theArgs) {
+  // ...
+}
+
+ +

Опис

+ +

Перед останнім параметром функції може стояти ..., в результаті решта аргументів (наданих користувачем) будуть розміщені у  "стандартному" масиві JavaScript.

+ +

Лише останній параметр може бути "залишковим".

+ +
function myFun(a, b, ...manyMoreArgs) {
+  console.log("a", a);
+  console.log("b", b);
+  console.log("manyMoreArgs", manyMoreArgs);
+}
+
+myFun("один", "два", "три", "чорити", "п'ять", "шість");
+
+// Виведе:
+// a, один
+// b, два
+// manyMoreArgs, ["три", "чотири", "п'ять", "шість"]
+ +

Різниця між залишковими параметрами та об'єктом arguments

+ +

Існують три основні відмінності між залишковими параметрами та об'єктом {{jsxref("Functions/arguments", "arguments")}}:

+ + + +

Від arguments до масиву

+ +

Залишкові параметри були запроваджені, щоб зменшити кількість шаблонного коду, спричиненого об'єктом arguments.

+ +
// До появи залишкових параметрів, "arguments" можна було перетворити на масив таким чином:
+
+function f(a, b) {
+
+  let normalArray = Array.prototype.slice.call(arguments);
+  // -- або --
+  let normalArray = [].slice.call(arguments);
+  // -- або --
+  let normalArray = Array.from(arguments);
+
+  let first = normalArray.shift(); // OK, вертає перший аргумент
+  let first = arguments.shift(); // ERROR (arguments не є справжнім масивом)
+}
+
+// Тепер ми легко можемо отримати звичайний масив за допомогою залишкових параметрів
+
+function f(...args) {
+  let normalArray = args;
+  let first = normalArray.shift(); // OK, вертає перший аргумент
+}
+ +

Приклади

+ +

Використання залишкових параметрів

+ +

У цьому прикладі перший аргумент відповідає "a", а другий "b", отже, ці іменовані аргументи можуть використовуватись як звичайні.

+ +

Однак, третій аргумент, "manyMoreArgs", буде масивом, який містить 3-й, 4-й, 5-й, 6-й ... n-й -- стільки аргументів, скільки надасть користувач.

+ +
function myFun(a, b, ...manyMoreArgs) {
+  console.log("a", a);
+  console.log("b", b);
+  console.log("manyMoreArgs", manyMoreArgs);
+}
+
+myFun("один", "два", "три", "чотири", "п'ять", "шість");
+
+// a, один
+// b, два
+// manyMoreArgs, ["три", "чотири", "п'ять", "шість"]
+ +

Нижче... хоча тут всього одне значення, останній аргумент все одно додається у масив.

+ +
// використовуємо ту саму функцію з наведеного вище прикладу
+
+myFun("один", "два", "три");
+
+// a, один
+// b, два
+// manyMoreArgs, ["три"]
+ +

Нижче... третій аргумент не був переданий, але "manyMoreArgs" все одно є масивом (хоча й порожнім).

+ +
// використовуємо ту саму функцію з наведеного вище прикладу
+
+myFun("один", "два");
+
+// a, один
+// b, два
+// manyMoreArgs, []
+ +

Кількість аргументів

+ +

Оскільки theArgs є масивом, кількість його елементів надається властивістю length:

+ +
function fun1(...theArgs) {
+  console.log(theArgs.length);
+}
+
+fun1()         // 0
+fun1(5)        // 1
+fun1(5, 6, 7)  // 3
+ +

Звичайний параметр та залишкові параметри

+ +

У наступному прикладі залишковий параметр використовується, щоб зібрати усі аргументи після першого у масиві. Далі кожен з них помножується на перший параметр, і масив повертається:

+ +
function multiply(multiplier, ...theArgs) {
+  return theArgs.map(function(element) {
+    return multiplier * element;
+  });
+}
+
+let arr = multiply(2, 1, 2, 3);
+console.log(arr); // [2, 4, 6]
+ +

Використання з об'єктом arguments

+ +

Методи Array можуть використовуватись на залишкових параметрах, але не на об'єкті arguments:

+ +
function sortRestArgs(...theArgs) {
+  var sortedArgs = theArgs.sort();
+  return sortedArgs;
+}
+
+console.log(sortRestArgs(5, 3, 7, 1)); // виводить [1, 3, 5, 7]
+
+function sortArguments() {
+  var sortedArgs = arguments.sort();
+  return sortedArgs; // цього ніколи не станеться
+}
+
+// викидає TypeError: arguments.sort is not a function
+console.log(sortArguments(5, 3, 7, 1));
+
+ +

Щоб скористатись методами Array на об'єкті arguments, він спочатку має бути перетворений на справжній масив.

+ +
function sortArguments() {
+  var args = Array.from(arguments);
+  var sortedArgs = args.sort();
+  return sortedArgs;
+}
+console.log(sortArguments(5, 3, 7, 1)); // [1, 3, 5, 7]
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}}
+ +

Сумісність з веб-переглядачами

+ +
+
+ + +

{{Compat("javascript.functions.rest_parameters")}}

+
+
+ +

Див. також

+ + diff --git "a/files/uk/web/javascript/reference/functions/\321\200\320\265\321\210\321\202\320\260_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\226\320\262/index.html" "b/files/uk/web/javascript/reference/functions/\321\200\320\265\321\210\321\202\320\260_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\226\320\262/index.html" deleted file mode 100644 index f117aecc60..0000000000 --- "a/files/uk/web/javascript/reference/functions/\321\200\320\265\321\210\321\202\320\260_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\226\320\262/index.html" +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: Залишкові параметри -slug: Web/JavaScript/Reference/Functions/решта_параметрів -tags: - - JavaScript - - Rest - - параметри - - функції -translation_of: Web/JavaScript/Reference/Functions/rest_parameters ---- -
{{jsSidebar("Functions")}}
- -
Синтаксис залишкових параметрів дозволяє представити невизначену кількість аргументів у вигляді масиву.
- -
- -

{{EmbedInteractiveExample("pages/js/functions-restparameters.html")}}

- - - -

Синтаксис

- -
function f(a, b, ...theArgs) {
-  // ...
-}
-
- -

Опис

- -

Перед останнім параметром функції може стояти ..., в результаті решта аргументів (наданих користувачем) будуть розміщені у  "стандартному" масиві JavaScript.

- -

Лише останній параметр може бути "залишковим".

- -
function myFun(a, b, ...manyMoreArgs) {
-  console.log("a", a);
-  console.log("b", b);
-  console.log("manyMoreArgs", manyMoreArgs);
-}
-
-myFun("один", "два", "три", "чорити", "п'ять", "шість");
-
-// Виведе:
-// a, один
-// b, два
-// manyMoreArgs, ["три", "чотири", "п'ять", "шість"]
- -

Різниця між залишковими параметрами та об'єктом arguments

- -

Існують три основні відмінності між залишковими параметрами та об'єктом {{jsxref("Functions/arguments", "arguments")}}:

- - - -

Від arguments до масиву

- -

Залишкові параметри були запроваджені, щоб зменшити кількість шаблонного коду, спричиненого об'єктом arguments.

- -
// До появи залишкових параметрів, "arguments" можна було перетворити на масив таким чином:
-
-function f(a, b) {
-
-  let normalArray = Array.prototype.slice.call(arguments);
-  // -- або --
-  let normalArray = [].slice.call(arguments);
-  // -- або --
-  let normalArray = Array.from(arguments);
-
-  let first = normalArray.shift(); // OK, вертає перший аргумент
-  let first = arguments.shift(); // ERROR (arguments не є справжнім масивом)
-}
-
-// Тепер ми легко можемо отримати звичайний масив за допомогою залишкових параметрів
-
-function f(...args) {
-  let normalArray = args;
-  let first = normalArray.shift(); // OK, вертає перший аргумент
-}
- -

Приклади

- -

Використання залишкових параметрів

- -

У цьому прикладі перший аргумент відповідає "a", а другий "b", отже, ці іменовані аргументи можуть використовуватись як звичайні.

- -

Однак, третій аргумент, "manyMoreArgs", буде масивом, який містить 3-й, 4-й, 5-й, 6-й ... n-й -- стільки аргументів, скільки надасть користувач.

- -
function myFun(a, b, ...manyMoreArgs) {
-  console.log("a", a);
-  console.log("b", b);
-  console.log("manyMoreArgs", manyMoreArgs);
-}
-
-myFun("один", "два", "три", "чотири", "п'ять", "шість");
-
-// a, один
-// b, два
-// manyMoreArgs, ["три", "чотири", "п'ять", "шість"]
- -

Нижче... хоча тут всього одне значення, останній аргумент все одно додається у масив.

- -
// використовуємо ту саму функцію з наведеного вище прикладу
-
-myFun("один", "два", "три");
-
-// a, один
-// b, два
-// manyMoreArgs, ["три"]
- -

Нижче... третій аргумент не був переданий, але "manyMoreArgs" все одно є масивом (хоча й порожнім).

- -
// використовуємо ту саму функцію з наведеного вище прикладу
-
-myFun("один", "два");
-
-// a, один
-// b, два
-// manyMoreArgs, []
- -

Кількість аргументів

- -

Оскільки theArgs є масивом, кількість його елементів надається властивістю length:

- -
function fun1(...theArgs) {
-  console.log(theArgs.length);
-}
-
-fun1()         // 0
-fun1(5)        // 1
-fun1(5, 6, 7)  // 3
- -

Звичайний параметр та залишкові параметри

- -

У наступному прикладі залишковий параметр використовується, щоб зібрати усі аргументи після першого у масиві. Далі кожен з них помножується на перший параметр, і масив повертається:

- -
function multiply(multiplier, ...theArgs) {
-  return theArgs.map(function(element) {
-    return multiplier * element;
-  });
-}
-
-let arr = multiply(2, 1, 2, 3);
-console.log(arr); // [2, 4, 6]
- -

Використання з об'єктом arguments

- -

Методи Array можуть використовуватись на залишкових параметрах, але не на об'єкті arguments:

- -
function sortRestArgs(...theArgs) {
-  var sortedArgs = theArgs.sort();
-  return sortedArgs;
-}
-
-console.log(sortRestArgs(5, 3, 7, 1)); // виводить [1, 3, 5, 7]
-
-function sortArguments() {
-  var sortedArgs = arguments.sort();
-  return sortedArgs; // цього ніколи не станеться
-}
-
-// викидає TypeError: arguments.sort is not a function
-console.log(sortArguments(5, 3, 7, 1));
-
- -

Щоб скористатись методами Array на об'єкті arguments, він спочатку має бути перетворений на справжній масив.

- -
function sortArguments() {
-  var args = Array.from(arguments);
-  var sortedArgs = args.sort();
-  return sortedArgs;
-}
-console.log(sortArguments(5, 3, 7, 1)); // [1, 3, 5, 7]
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}}
- -

Сумісність з веб-переглядачами

- -
-
- - -

{{Compat("javascript.functions.rest_parameters")}}

-
-
- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/functions/\321\201\321\202\321\200\321\226\320\273\320\272\320\276\320\262\321\226_\321\204\321\203\320\275\320\272\321\206\321\226\321\227/index.html" "b/files/uk/web/javascript/reference/functions/\321\201\321\202\321\200\321\226\320\273\320\272\320\276\320\262\321\226_\321\204\321\203\320\275\320\272\321\206\321\226\321\227/index.html" deleted file mode 100644 index f1638d8d84..0000000000 --- "a/files/uk/web/javascript/reference/functions/\321\201\321\202\321\200\321\226\320\273\320\272\320\276\320\262\321\226_\321\204\321\203\320\275\320\272\321\206\321\226\321\227/index.html" +++ /dev/null @@ -1,362 +0,0 @@ ---- -title: Стрілкові функції -slug: Web/JavaScript/Reference/Functions/Стрілкові_функції -translation_of: Web/JavaScript/Reference/Functions/Arrow_functions ---- -
{{jsSidebar("Functions")}}
- -

Вирази стрілкових функцій мають більш короткий синтаксис, аніж функціональні вирази і не мають свого власного this, arguments, super, і new.target. Вони не можуть бути використані як конструктор і завжди анонімні.

- -

Синтаксис

- -

Basic Syntax

- -
(параметр1,параметр2, …, параметрN) => { оператори }
-(параметр1, параметр2, …, параметрN) => вираз
-// еквівалентно до запису: (параметр1,параметр2, …, параметрN) => { return вираз; }
-
-// Якщо у функції тільки один параметр, то дужки не обов'язкові:
-(параметр) => { оператори }
-параметр => { оператори }
-параметр => вираз
-
-
-// Список параметрів для функції без параметрів повинен бути записаний у парі фігурних дужок.
-() => { оператори }
-
- -

Advanced Syntax

- -
// Візьміть тіло функції у дужки, якщо вона повертає об'єкт
-params => ({foo: bar})
-
-// Залишкові параметри та параметри за замовчуванням підтримуються як і в звичайних функціях
-(параметр1, параметр2, ...залишкові параметри) => { оператори }
-(параметр1 = значення_за_замовчуванням, параметр2, …, параметрN = значення_за_замовчуваннямN) => { оператори }
-
-// Деструктиризація в списку параметрів також підтримується:
-let f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
-f();
-// 6
-
- -

Опис

- -

Див. також "ES6 In Depth: Arrow functions" on hacks.mozilla.org.

- -

Появу стрілкових функцій зумовили два фактори: можливість більш короткого запису і випадки, коли сутність this не обов'язкова.

- -

Коротший запис

- -
var materials = [
-  'Hydrogen',
-  'Helium',
-  'Lithium',
-  'Beryllium'
-];
-
-materials.map(function(material) {
-  return material.length;
-}); // [8, 6, 7, 9]
-
-materials.map((material) => {
-  return material.length;
-}); // [8, 6, 7, 9]
-
-materials.map(material => material.length); // [8, 6, 7, 9]
-
- -

Спільний this

- -

До появи стрілкових функцій кожна нова функція мала власне значення this :

- - - -

Це все було далеким від ідеалів об'єктно-орієнтованого програмування.

- -
function Person() {
-  // The Person() constructor defines `this` as an instance of itself.
-  this.age = 0;
-
-  setInterval(function growUp() {
-    // In non-strict mode, the growUp() function defines `this`
-    // as the global object, which is different from the `this`
-    // defined by the Person() constructor.
-    this.age++;
-  }, 1000);
-}
-
-var p = new Person();
- -

В ECMAScript 3/5 ця проблема вирішувалась шляхом присвоєння значення this змінній, оголошеній всередині функції.

- -
function Person() {
-  var that = this;
-  that.age = 0;
-
-  setInterval(function growUp() {
-    // The callback refers to the `that` variable of which
-    // the value is the expected object.
-    that.age++;
-  }, 1000);
-}
- -

Або можна створити bound function (прив'язану функцію), в яку передати значення this для функції (функція growUp() в прикладі вище).

- -

Стрілкова функція не має власного контексту this, а використовує this з контексту вище. Тому в коді, наведеному нижче, this для функції setInterval має таке ж значення, як і this зовнішньої функції:

- -
function Person(){
-  this.age = 0;
-
-  setInterval(() => {
-    this.age++; // |this| properly refers to the person object
-  }, 1000);
-}
-
-var p = new Person();
- -

Relation with strict mode

- -

Given that this comes from the surrounding lexical context, strict mode rules with regard to this are ignored.

- -
var f = () => { 'use strict'; return this; };
-f() === window; // or the global object
- -

All other strict mode rules apply normally.

- -

Invoked through call or apply

- -

Since arrow functions do not have their own this, the methods call() or apply() can only pass in parameters. thisArg is ignored.

- -
var adder = {
-  base: 1,
-
-  add: function(a) {
-    var f = v => v + this.base;
-    return f(a);
-  },
-
-  addThruCall: function(a) {
-    var f = v => v + this.base;
-    var b = {
-      base: 2
-    };
-
-    return f.call(b, a);
-  }
-};
-
-console.log(adder.add(1));         // This would log to 2
-console.log(adder.addThruCall(1)); // This would log to 2 still
- -

No binding of arguments

- -

Arrow functions do not have their own arguments object. Thus, in this example, arguments is simply a reference to the arguments of the enclosing scope:

- -
var arguments = [1, 2, 3];
-var arr = () => arguments[0];
-
-arr(); // 1
-
-function foo(n) {
-  var f = () => arguments[0] + n; // foo's implicit arguments binding. arguments[0] is n
-  return f(10);
-}
-
-foo(1); // 2
- -

In most cases, using rest parameters is a good alternative to using an arguments object.

- -
function foo(n) {
-  var f = (...args) => args[0] + n;
-  return f(10);
-}
-
-foo(1); // 11
- -

Arrow functions used as methods

- -

As stated previously, arrow function expressions are best suited for non-method functions. Let's see what happens when we try to use them as methods:

- -
'use strict';
-var obj = {
-  i: 10,
-  b: () => console.log(this.i, this),
-  c: function() {
-    console.log(this.i, this);
-  }
-}
-obj.b(); // prints undefined, Window {...} (or the global object)
-obj.c(); // prints 10, Object {...}
- -

Arrow functions do not have their own this. Another example involving {{jsxref("Object.defineProperty()")}}:

- -
'use strict';
-var obj = {
-  a: 10
-};
-
-Object.defineProperty(obj, 'b', {
-  get: () => {
-    console.log(this.a, typeof this.a, this);
-    return this.a + 10; // represents global object 'Window', therefore 'this.a' returns 'undefined'
-  }
-});
-
- -

Use of the new operator

- -

Arrow functions cannot be used as constructors and will throw an error when used with new.

- -
var Foo = () => {};
-var foo = new Foo(); // TypeError: Foo is not a constructor
- -

Use of prototype property

- -

Arrow functions do not have a prototype property.

- -
var Foo = () => {};
-console.log(Foo.prototype); // undefined
-
- -

Use of the yield keyword

- -

The yield keyword may not be used in an arrow function's body (except when permitted within functions further nested within it). As a consequence, arrow functions cannot be used as generators.

- -

Тіло функції

- -

Arrow functions can have either a "concise body" or the usual "block body".

- -

In a concise body, only an expression is specified, which becomes the explicit return value. In a block body, you must use an explicit return statement.

- -
var func = x => x * x;
-// concise body syntax, implied "return"
-
-var func = (x, y) => { return x + y; };
-// with block body, explicit "return" needed
-
- -

Повернення літерала об'єкта

- -

Keep in mind that returning object literals using the concise body syntax params => {object:literal} will not work as expected.

- -
var func = () => { foo: 1 };
-// Calling func() returns undefined!
-
-var func = () => { foo: function() {} };
-// SyntaxError: function statement requires a name
- -

This is because the code inside braces ({}) is parsed as a sequence of statements (i.e. foo is treated like a label, not a key in an object literal).

- -

Remember to wrap the object literal in parentheses.

- -
var func = () => ({foo: 1});
- -

Розрив рядка

- -

An arrow function cannot contain a line break between its parameters and its arrow.

- -
var func = ()
-           => 1;
-// SyntaxError: expected expression, got '=>'
- -

Порядок розбору

- -

Although the arrow in an arrow function is not an operator, arrow functions have special parsing rules that interact differently with operator precedence compared to regular functions.

- -
let callback;
-
-callback = callback || function() {}; // ok
-
-callback = callback || () => {};
-// SyntaxError: invalid arrow-function arguments
-
-callback = callback || (() => {});    // ok
-
- -

Ще приклади

- -
// An empty arrow function returns undefined
-let empty = () => {};
-
-(() => 'foobar')();
-// Returns "foobar"
-// (this is an Immediately Invoked Function Expression
-// see 'IIFE' in glossary)
-
-var simple = a => a > 15 ? 15 : a;
-simple(16); // 15
-simple(10); // 10
-
-let max = (a, b) => a > b ? a : b;
-
-// Easy array filtering, mapping, ...
-
-var arr = [5, 6, 13, 0, 1, 18, 23];
-
-var sum = arr.reduce((a, b) => a + b);
-// 66
-
-var even = arr.filter(v => v % 2 == 0);
-// [6, 0, 18]
-
-var double = arr.map(v => v * 2);
-// [10, 12, 26, 0, 2, 36, 46]
-
-// More concise promise chains
-promise.then(a => {
-  // ...
-}).then(b => {
-  // ...
-});
-
-// Parameterless arrow functions that are visually easier to parse
-setTimeout( () => {
-  console.log('I happen sooner');
-  setTimeout( () => {
-    // deeper code
-    console.log('I happen later');
-  }, 1);
-}, 1);
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES2015', '#sec-arrow-function-definitions', 'Arrow Function Definitions')}}{{Spec2('ES2015')}}Початкова виознака.
{{SpecName('ESDraft', '#sec-arrow-function-definitions', 'Arrow Function Definitions')}}{{Spec2('ESDraft')}}
- -

Підтримка веб-переглядачами

- -
- - -

{{Compat("javascript.functions.arrow_functions")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/array/prototype/index.html b/files/uk/web/javascript/reference/global_objects/array/prototype/index.html deleted file mode 100644 index a4af191650..0000000000 --- a/files/uk/web/javascript/reference/global_objects/array/prototype/index.html +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Array.prototype -slug: Web/JavaScript/Reference/Global_Objects/Array/prototype -tags: - - Array - - JavaScript - - Property - - Джава Скріпт - - Масив - - Поле -translation_of: Web/JavaScript/Reference/Global_Objects/Array/prototype ---- -
{{JSRef}}
- -

Поле Array.prototype представляє собою прототип для конструктора {{jsxref("Array")}} і дозволяє вам додавати нові поля і методи до всіх об'єктів-масивів (Array).

- -
// Якщо JavaScript не реалізовує метод first() початково,
-// додайте новий метод, який буде повертати перший елемент масиву.
-
-if (!Array.prototype.first) {
-  Array.prototype.first = function() {
-    return this[0];
-  }
-}
-
- -

Опис

- -

Екземпляри {{jsxref("Array")}} успадковуються від Array.prototype. Як і з всіх конструкторів, ви можете змінити прототип конструктора об'єкта, щоб внести зміни у всі екземпляри {{jsxref("Array")}}. Для прикладу, це використовується для {{Glossary("Polyfill", "polyfilling")}}.

- -

Маловідомий факт: Array.prototype сам є масивом {{jsxref("Array")}}:

- -
Array.isArray(Array.prototype); // true
-
- -

{{js_property_attributes(0, 0, 0)}}

- -

Властивості

- -
-
Array.prototype.constructor
-
Визначає функцію, що створює прототип об'єкта.
-
{{jsxref("Array.prototype.length")}}
-
Відображає кількість елементів в масиві.
-
{{jsxref("Array.@@unscopables", "Array.prototype[@@unscopables]")}}
-
Символ, який містить назви властивостей, які повинні бути виключені з області зв'язування with.
-
- -

Методи

- -

Методи модифікації

- -

Ці методи модифікують масив:

- -
-
{{jsxref("Array.prototype.copyWithin()")}}
-
Копіює послідовність елементів масиву всередині масиву.
-
{{jsxref("Array.prototype.fill()")}}
-
Заповнює всі елементи масиву від початкового індексу до кінцевого статичними значеннями.
-
{{jsxref("Array.prototype.pop()")}}
-
Видаляє та повертає останній елемент масиву.
-
{{jsxref("Array.prototype.push()")}}
-
Додає один чи більше елементів  в кінець масиву та повертає нову довжину масиву.
-
{{jsxref("Array.prototype.reverse()")}}
-
Змінює порядок елементів масиву на протилежний, викорустовуючи той самий масив — перший стає останнім, а останній - першим.
-
{{jsxref("Array.prototype.shift()")}}
-
Видаляє та повертає перший елемент масиву.
-
{{jsxref("Array.prototype.sort()")}}
-
Сортує елементи всередині масиву, та повертає цей масив.
-
{{jsxref("Array.prototype.splice()")}}
-
Добавляє і/або видаляє елементи з масиву.
-
{{jsxref("Array.prototype.unshift()")}}
-
Добавляє один або більше елементів у початок масиву та повертає нову довжину масиву.
-
- -

Методи доступу

- -

Ці методи не модифікують масив та повертають якесь його представлення.

- -
-
{{jsxref("Array.prototype.concat()")}}
-
Повертає новий масив, який складається з цього масиву, об'єднаного з іншим(и) масив(ом/ами) та/або іншими значеннями.
-
{{jsxref("Array.prototype.includes()")}} {{experimental_inline}}
-
Визначає, чи масив містить певний елемент,  повертаючи, відповідно, true або false.
-
{{jsxref("Array.prototype.indexOf()")}}
-
Повертає перший (останній) індекс елемента всередині даного масиву, який дорівнює вказаному значенню, або -1 якщо нічого не було знайдено.
-
{{jsxref("Array.prototype.join()")}}
-
Об'єднує всі елементи масиву у рядок.
-
{{jsxref("Array.prototype.lastIndexOf()")}}
-
Повертає останній (найбільший) індекс елемента всередині даного масиву, який рівний вказаному значенню, або -1 якщо нічого не було знайдено.
-
{{jsxref("Array.prototype.slice()")}}
-
Витягує частину масиву та повертає новий масив.
-
{{jsxref("Array.prototype.toSource()")}} {{non-standard_inline}}
-
Повертає літерал масиву, який відображає вказаний масив; ви можете використовувати це значення для створення нового масиву. Перевизначає метод {{jsxref("Object.prototype.toSource()")}}.
-
{{jsxref("Array.prototype.toString()")}}
-
Повертає рядок, яка відображає даний масив та його елементи. Перевизначає метод {{jsxref("Object.prototype.toString()")}}.
-
{{jsxref("Array.prototype.toLocaleString()")}}
-
Повертає локалізований рядок, яка відображає даний масив та його елементи. Перевизначає метод {{jsxref("Object.prototype.toLocaleString()")}}.
-
- -

Методи  перебору

- -

Декілька методів приймають у якості аргументів функції, які будуть викликані у процесі обробки масиву. Коли ці методи викликаються, довжина поля length вибраного масиву запам'ятовується, і будь-які елементи, додані поза цією довжиною зсередини функції зворотнього виклику (callback), не будуть обходитися. Інші зміни до масиву (встановлення значення елементу або його видалення) можуть впливати на результат операції, якщо метод після цього звертається до зміненого елемента. Хоча специфічна поведінка цих методів у даних випадках є добре визначеною, не варто на неї надто покладатися, щоб не заплутати тих, хто може прочитати ваш код. Якщо вам необхідно змінити даний масив, краще скопіюйте його у новий масив.

- -
-
{{jsxref("Array.prototype.entries()")}}
-
Повертає новий об'єкт Array Iterator, який містить пари ключ/значення для кожного індекса в даному масиві.
-
{{jsxref("Array.prototype.every()")}}
-
Повертає true, якщо кожен елемент у цьому масиві виконує умови переданої тест-функції.
-
{{jsxref("Array.prototype.filter()")}}
-
Створює новий масив зі всіма елементами цього масиву, для яких передана функція фільтрації повертае true.
-
{{jsxref("Array.prototype.find()")}}
-
Повертає знайдене у масиві значення, якщо елемент у цьому масиві виконує умови переданої тест-функції або undefined якщо елемента не знайдено.
-
{{jsxref("Array.prototype.findIndex()")}}
-
Повертає знайдений у масиві індекс, якщо елемент у цьому масиві виконує умови переданої тест-функції або -1 якщо елемента не знайдено.
-
{{jsxref("Array.prototype.forEach()")}}
-
Викликає функцію для кожного елементу масиву.
-
{{jsxref("Array.prototype.keys()")}}
-
Повертає новий об'єкт Array Iterator, який містить ключі для кожного індекса в даному масиві.
-
{{jsxref("Array.prototype.map()")}}
-
Створює новий масив з результатами виклику на кожному елементі масиву переданої функції.
-
{{jsxref("Array.prototype.reduce()")}}
-
Застосовує функцію над акумулятором та кожним значенням даного масиву (зліва направо), щоб скоротити його до єдиного значення.
-
{{jsxref("Array.prototype.reduceRight()")}}
-
Застосовує функцію над акумулятором та кожним значенням даного масиву (справа наліво), щоб скоротити його до єдиного значення.
-
{{jsxref("Array.prototype.some()")}}
-
Повертає true, якщо принаймні один елемент у цьому масиві виконує умови переданої тест-функції.
-
{{jsxref("Array.prototype.values()")}}
-
Повертає новий об'єкт Array Iterator, який містить значення для кожного індекса в масиві.
-
{{jsxref("Array.prototype.@@iterator()", "Array.prototype[@@iterator]()")}}
-
Повертає новий об'єкт Array Iterator, який містить значення для кожного індекса в масиві.
-
- -

Загальні методи (нестандартні)

- -

Багато методів на JavaScript об'єкті Array спроектовані таким чином, щоб їх можна було застосувати на всіх об'ектах, які "виглядають як" масиви. Таким чином, вони можуть бути використані на будь-якому об'єкті, у якого є поле length, а також тих об'єктах, доступ до яких можна отримати завдяки числовим назвам полів (як з індексацією масиву array[5]). Деякі методи, такі як {{jsxref("Array.join", "join")}}, лише зчитують довжину (length) і числові поля об'єктів, на яких вони викликаються. Інші, такі як {{jsxref("Array.reverse", "reverse")}}, вимагають, щоб числові поля об'єкту та поле length були доступні для редагування; тому ці методи можуть не викликатися на об'єктах типу {{jsxref("String")}}, який не дозволяє редагувати його поле length або синтезовані числові поля.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення
{{SpecName('ES5.1', '#sec-15.4.3.1', 'Array.prototype')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-array.prototype', 'Array.prototype')}}{{Spec2('ES6')}}Додані методи copyWithin(), fill(), entries(), keys(), values(), find(), findIndex().
{{SpecName('ESDraft', '#sec-array.prototype', 'Array.prototype')}}{{Spec2('ESDraft')}}Доданий метод includes().
- -

Сумісність із веб-переглядачами

- - - -

{{Compat("javascript.builtins.Array.prototype")}}

- -
- -

Дивіться також

- - diff --git a/files/uk/web/javascript/reference/global_objects/asyncfunction/prototype/index.html b/files/uk/web/javascript/reference/global_objects/asyncfunction/prototype/index.html deleted file mode 100644 index c2df6c31db..0000000000 --- a/files/uk/web/javascript/reference/global_objects/asyncfunction/prototype/index.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: AsyncFunction.prototype -slug: Web/JavaScript/Reference/Global_Objects/AsyncFunction/prototype -tags: - - JavaScript - - Властивість - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/AsyncFunction/prototype ---- -
{{JSRef}}
- -

Властивість AsyncFunction.prototype відображає прототип об'єкта {{jsxref("AsyncFunction")}}.

- -

Опис

- -

Об'єкти {{jsxref("AsyncFunction")}} успадковуються від AsyncFunction.prototype. AsyncFunction.prototype не може бути змінений.

- -

Властивості

- -
-
AsyncFunction.constructor
-
Початковим значенням є {{jsxref("AsyncFunction")}}.
-
AsyncFunction.prototype[@@toStringTag]
-
Вертає "AsyncFunction".
-
- -

Специфікації

- - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ESDraft', '#sec-async-function-constructor-prototype', 'AsyncFunction.prototype')}}{{Spec2('ESDraft')}}Початкове визначення у ES2017.
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.AsyncFunction.prototype")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/boolean/prototype/index.html b/files/uk/web/javascript/reference/global_objects/boolean/prototype/index.html deleted file mode 100644 index dd69fe02f7..0000000000 --- a/files/uk/web/javascript/reference/global_objects/boolean/prototype/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Boolean.prototype -slug: Web/JavaScript/Reference/Global_Objects/Boolean/prototype -tags: - - Boolean - - JavaScript - - Властивість - - Поле - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Boolean -translation_of_original: Web/JavaScript/Reference/Global_Objects/Boolean/prototype ---- -
{{JSRef}}
- -

Поле Boolean.prototype представляє прототип конструктора {{jsxref("Boolean")}}.

- -
{{js_property_attributes(0, 0, 0)}}
- -
{{EmbedInteractiveExample("pages/js/boolean-constructor.html")}}
- - - -

Опис

- -

Екземпляри {{jsxref("Boolean")}} наслідуються від Boolean.prototype. Ви можете використовувати об'єкт прототипа конструктора, щоб додавати свої поля та методи до всіх екземплярів {{jsxref("Boolean")}}.

- -

Властивості

- -
-
Boolean.prototype.constructor
-
Повертає функцію, що створила прототип екземпляра. За замовчування це функція {{jsxref("Boolean")}}.
-
- -

Методи

- -
-
{{jsxref("Boolean.prototype.toSource()")}} {{non-standard_inline}}
-
Повертає строку, що містить сирець об'єкту {{jsxref("Boolean")}}; використавши її ви можете створити еквівалентний об'єкт. Перевизначає метод {{jsxref("Object.prototype.toSource()")}}.
-
{{jsxref("Boolean.prototype.toString()")}}
-
Повертає строку "true" чи "false" залежно від значення об'єкту. Перевизначає метод {{jsxref("Object.prototype.toString()")}}.
-
{{jsxref("Boolean.prototype.valueOf()")}}
-
Повертає примітив значення об'єкту {{jsxref("Boolean")}}. Перевизначає метод {{jsxref("Object.prototype.valueOf()")}}.
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусПримітка
{{SpecName('ES1')}}{{Spec2('ES1')}}Первинне визначення. Реалізовано у JavaScript 1.0.
{{SpecName('ES5.1', '#sec-15.6.3.1', 'Boolean.prototype')}}{{Spec2('ES5.1')}} 
{{SpecName('ES6', '#sec-boolean.prototype', 'Boolean.prototype')}}{{Spec2('ES6')}} 
{{SpecName('ESDraft', '#sec-boolean.prototype', 'Boolean.prototype')}}{{Spec2('ESDraft')}} 
- -

Підтримка у браузерах

- -
- - -

{{Compat("javascript.builtins.Boolean.prototype")}}

-
diff --git a/files/uk/web/javascript/reference/global_objects/error/prototype/index.html b/files/uk/web/javascript/reference/global_objects/error/prototype/index.html deleted file mode 100644 index c0bcaf8739..0000000000 --- a/files/uk/web/javascript/reference/global_objects/error/prototype/index.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Error.prototype -slug: Web/JavaScript/Reference/Global_Objects/Error/prototype -tags: - - Error - - JavaScript - - Властивість - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Error -translation_of_original: Web/JavaScript/Reference/Global_Objects/Error/prototype ---- -
{{JSRef}}
- -

Властивість Error.prototype є прототипом для конструктора {{jsxref("Error")}}.

- -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Всі екземпляри {{jsxref("Error")}} та екземпляри {{jsxref("Global_Objects/Error", "базових конструкторів помилок", "#Типи_помилок", 1)}} успадковуються від Error.prototype. Як в усіх функціях-конструкторах, ви можете використовувати прототип конструктора, щоб додавати властивості чи методи до усіх екземплярів, створених цим конструктором. 

- -

Властивості

- -

Стандартні властивості

- -
-
Error.prototype.constructor
-
Функція, яка створила прототип екземпляра.
-
{{jsxref("Error.prototype.message")}}
-
Повідомлення помилки.
-
{{jsxref("Error.prototype.name")}}
-
Ім'я помилки.
-
- -

Спеціальні розширення

- -

{{non-standard_header}}

- -

Microsoft

- -
-
Error.description
-
Опис помилки. Властивість схожа на {{jsxref("Error.prototype.message", "message")}}.
-
Error.number
-
Номер помилки.
-
- -

Mozilla

- -
-
{{jsxref("Error.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку.
-
{{jsxref("Error.prototype.lineNumber")}}
-
Номер рядка у файлі, що спричинив помилку.
-
{{jsxref("Error.prototype.columnNumber")}}
-
Номер стовпця у файлі, де виникла помилка.
-
{{jsxref("Error.prototype.stack")}}
-
Трасування стеку.
-
- -

Методи

- -
-
{{jsxref("Error.prototype.toSource()")}} {{non-standard_inline}}
-
Повертає рядок з кодом, що спричинить створення заданого об'єкта {{jsxref("Error")}}; ви можете використати це значення, щоб створити новий об'єкт. Заміщує метод {{jsxref("Object.prototype.toSource()")}}.
-
{{jsxref("Error.prototype.toString()")}}
-
Повертає рядок, що представляє заданий об'єкт. Заміщує метод {{jsxref("Object.prototype.toString()")}}.
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення Реалізовано у JavaScript 1.1.
{{SpecName('ES5.1', '#sec-15.11.3.1', 'Error')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-error.prototype', 'Error')}}{{Spec2('ES6')}}
{{SpecName('ESDraft', '#sec-error.prototype', 'Error')}}{{Spec2('ESDraft')}}
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.Error.prototype")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/evalerror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/evalerror/prototype/index.html deleted file mode 100644 index 567dad0c0b..0000000000 --- a/files/uk/web/javascript/reference/global_objects/evalerror/prototype/index.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: EvalError.prototype -slug: Web/JavaScript/Reference/Global_Objects/EvalError/prototype -tags: - - Error - - EvalError - - JavaScript - - помилка -translation_of: Web/JavaScript/Reference/Global_Objects/EvalError -translation_of_original: Web/JavaScript/Reference/Global_Objects/EvalError/prototype ---- -
{{JSRef}}
- -

Властивість EvalError.prototype є прототипом для конструктора {{jsxref("EvalError")}}.

- -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Всі екземпляри {{jsxref("EvalError")}} успадковуються від EvalError.prototype. Ви можете використати прототип, щоб додати властивості та методи до усіх екземплярів.

- -

Властивості

- -
-
EvalError.prototype.constructor
-
Функція, яка створила прототип об'єкта.
-
{{jsxref("Error.prototype.message", "EvalError.prototype.message")}}
-
Повідомлення помилки. Хоча ECMA-262 зазначає, що {{jsxref("EvalError")}} повинен мати власну властивість message, у SpiderMonkey він успадковує {{jsxref("Error.prototype.message")}}.
-
{{jsxref("Error.prototype.name", "EvalError.prototype.name")}}
-
Ім'я помилки. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.fileName", "EvalError.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "EvalError.prototype.lineNumber")}}
-
Номер рядка файлу, в якому виникла помилка. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "EvalError.prototype.columnNumber")}}
-
Номер стовпця у рядку, де виникла помилка. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.stack", "EvalError.prototype.stack")}}
-
Трасування стеку. Успадковано від {{jsxref("Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("EvalError")}} не містить власних методів, екземпляри {{jsxref("EvalError")}} успадковують деякі методи через ланцюжок прототипів.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES3')}}{{Spec2('ES3')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES5.1')}}Визначено як NativeError.prototype.
{{SpecName('ES6', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ES6')}}Визначено як NativeError.prototype.
{{SpecName('ESDraft', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ESDraft')}}Визначено як NativeError.prototype.
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.EvalError")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/function/prototype/index.html b/files/uk/web/javascript/reference/global_objects/function/prototype/index.html deleted file mode 100644 index aefa5cad6b..0000000000 --- a/files/uk/web/javascript/reference/global_objects/function/prototype/index.html +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Function.prototype -slug: Web/JavaScript/Reference/Global_Objects/Function/prototype -tags: - - Function - - JavaScript - - Властивість - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Function -translation_of_original: Web/JavaScript/Reference/Global_Objects/Function/prototype ---- -
{{JSRef}}
- -

Властивість Function.prototype є об'єктом прототипу {{jsxref("Function")}}.

- -

Опис

- -

Об'єкти {{jsxref("Function")}} успадковуються від Function.prototypeFunction.prototype не можна змінити.

- -

Властивості

- -
-
{{jsxref("Function.prototype.arguments")}} {{deprecated_inline}}
-
Масив, що відповідає аргументам, переданим у функцію. Це застаріла властивість {{jsxref("Function")}}. Використовуйте натомість об'єкт {{jsxref("Functions/arguments", "arguments")}}, доступний всередині функції.
-
{{jsxref("Function.arity")}} {{obsolete_inline}}
-
Вказувала кількість аргументів, очікуваних функцією, але була видалена. Використовуйте натомість властивість {{jsxref("Function.length", "length")}}.
-
{{jsxref("Function.prototype.caller")}} {{non-standard_inline}}
-
Вказує функцію, що викликала функцію, яка виконується.
-
{{jsxref("Function.prototype.length")}}
-
Вказує кількість аргументів, очікуваних функцією.
-
{{jsxref("Function.prototype.name")}}
-
Ім'я функції.
-
{{jsxref("Function.displayName")}} {{non-standard_inline}}
-
Ім'я, що відображається для функції.
-
Function.prototype.constructor
-
Вказує функцію, яка створює прототип об'єкта. Більше інформації дивіться на сторінці {{jsxref("Object.prototype.constructor")}}.
-
- -

Методи

- -
-
{{jsxref("Function.prototype.apply()")}}
-
Викликає функцію та встановлює її this надане значення, аргументи можуть передаватися об'єктом {{jsxref("Array")}}.
-
{{jsxref("Function.prototype.bind()")}}
-
Створює нову функцію, в якої під час виклику this присвоєне надане значення, з заданою послідовністю аргументів, що передують будь-якім іншим наданим аргументам під час виклику нової функції.
-
{{jsxref("Function.prototype.call()")}}
-
Викликає (виконує) функцію та присвоює її this надане значення, аргументи можуть передаватися як є.
-
{{jsxref("Function.prototype.isGenerator()")}} {{non-standard_inline}}
-
Повертає true, якщо функція є генератором; інакше повертає false.
-
{{jsxref("Function.prototype.toSource()")}} {{non-standard_inline}}
-
Повертає рядкове представлення першокоду функції. Заміщує метод {{jsxref("Object.prototype.toSource")}}.
-
{{jsxref("Function.prototype.toString()")}}
-
Повертає рядкове представлення першокоду функції. Заміщує метод {{jsxref("Object.prototype.toString")}}.
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення. Реалізоване у JavaScript 1.1
{{SpecName('ES5.1', '#sec-15.3.5.2', 'Function.prototype')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-function-instances-prototype', 'Function.prototype')}}{{Spec2('ES6')}}
{{SpecName('ESDraft', '#sec-function-instances-prototype', 'Function.prototype')}}{{Spec2('ESDraft')}}
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.Function.prototype")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/generatorfunction/prototype/index.html b/files/uk/web/javascript/reference/global_objects/generatorfunction/prototype/index.html deleted file mode 100644 index 0c20812347..0000000000 --- a/files/uk/web/javascript/reference/global_objects/generatorfunction/prototype/index.html +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: GeneratorFunction.prototype -slug: Web/JavaScript/Reference/Global_Objects/GeneratorFunction/prototype -tags: - - ECMAScript 2015 - - GeneratorFunction - - JavaScript - - Ітератор - - Властивість - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/GeneratorFunction -translation_of_original: Web/JavaScript/Reference/Global_Objects/GeneratorFunction/prototype ---- -
{{JSRef}}
- -

Властивість GeneratorFunction.prototype відображає прототип {{jsxref("GeneratorFunction")}}.

- -

Опис

- -

Об'єкти {{jsxref("GeneratorFunction")}} успадковуються від GeneratorFunction.prototype. GeneratorFunction.prototype не можна змінювати.

- -

Властивості

- -
-
GeneratorFunction.constructor
-
Початковим значенням є {{jsxref("GeneratorFunction")}}.
-
GeneratorFunction.prototype.prototype
-
Значення дорівнює %GeneratorPrototype%.
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES2015', '#sec-generatorfunction.prototype', 'GeneratorFunction.prototype')}}{{Spec2('ES2015')}}Початкове визначення.
{{SpecName('ESDraft', '#sec-generatorfunction.prototype', 'GeneratorFunction.prototype')}}{{Spec2('ESDraft')}}
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.GeneratorFunction.prototype")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/internalerror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/internalerror/prototype/index.html deleted file mode 100644 index 44dc74ec1a..0000000000 --- a/files/uk/web/javascript/reference/global_objects/internalerror/prototype/index.html +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: InternalError.prototype -slug: Web/JavaScript/Reference/Global_Objects/InternalError/prototype -tags: - - Error - - InternalError - - JavaScript - - Властивість - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/InternalError -translation_of_original: Web/JavaScript/Reference/Global_Objects/InternalError/prototype ---- -
{{JSRef}} {{non-standard_header}}
- -

Властивість InternalError.prototype є прототипом конструктора {{jsxref("InternalError")}}.

- -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Всі екземпляри {{jsxref("InternalError")}} успадковуються від InternalError.prototype. Ви можете використати прототип, щоб додати властивості чи методи до усіх екземплярів.

- -

Властивості

- -
-
InternalError.prototype.constructor
-
Визначає функцію, яка створила прототип об'єкта.
-
{{jsxref("Error.prototype.message", "InternalError.prototype.message")}}
-
Повідомлення помилки. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.name", "InternalError.prototype.name")}}
-
Ім'я помилки. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.fileName", "InternalError.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "InternalError.prototype.lineNumber")}}
-
Номер рядка файлу, в якому виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "InternalError.prototype.columnNumber")}}
-
Номер стовпця у рядку, де виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.stack", "InternalError.prototype.stack")}}
-
Трасування стеку. Успаковано від {{jsxref("Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("InternalError")}} не має власних методів, екземпляри {{jsxref("InternalError")}} успадковують деякі методи через ланцюжок прототипів.

- -

Специфікації

- -

Не є частиною жодних специфікацій.

- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.InternalError")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/math/round/index.html b/files/uk/web/javascript/reference/global_objects/math/round/index.html new file mode 100644 index 0000000000..92cc055f83 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/math/round/index.html @@ -0,0 +1,194 @@ +--- +title: Math.round() +slug: Web/JavaScript/Reference/Global_Objects/Math/заокругелння +tags: + - JavaScript + - Math + - Довідка + - Заокруглення + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Math/round +--- +
{{JSRef}}
+ +

Функція Math.round() повертає значення числа заокруглене до найближчого цілого.

+ +

 

+ +
{{EmbedInteractiveExample("pages/js/math-round.html")}}
+ + + +

 

+ +

Синтаксис

+ +
Math.round(x)
+ +

Параметри

+ +
+
x
+
Число.
+
+ +

Повернуте значення

+ +

Значення отриманого числа, округлене до найближчого цілого.

+ +

Опис

+ +

Якщо дробова частина числа більша або рівна 0.5, аргумент буде округлено до найближчого більшого цілого. Якщо дробова частина числа менша 0.5, аргумент буде округлено до найближчого меншого цілого. Якщо дробова частина рівна 0.5, то аргумент буде округлено до найближчого цілого в напрямку +∞.  Зверніть увагу, що функція round() відрізняється від багатьох мов, які часто приводять цей випадок до наступного цілого числа, віддаленого від нуля (маємо інший результат у випадку від'ємних чисел з дробовою частиною рівною 0.5).

+ +

Оскільки round() - це статичний метод Math, ви завжди використовуєте його як Math.round (), а не як метод об'єкта Math, який ви створили (Math не має конструктора).

+ +

Приклади

+ +
Math.round( 20.49); //  20
+Math.round( 20.5);  //  21
+Math.round( 42  );  //  42
+Math.round(-20.5);  // -20
+Math.round(-20.51); // -21
+
+ +

Десяткове округлення

+ +
// Closure
+(function() {
+  /**
+   * Decimal adjustment of a number.
+   *
+   * @param {String}  type  The type of adjustment.
+   * @param {Number}  value The number.
+   * @param {Integer} exp   The exponent (the 10 logarithm of the adjustment base).
+   * @returns {Number} The adjusted value.
+   */
+  function decimalAdjust(type, value, exp) {
+    // If the exp is undefined or zero...
+    if (typeof exp === 'undefined' || +exp === 0) {
+      return Math[type](value);
+    }
+    value = +value;
+    exp = +exp;
+    // If the value is not a number or the exp is not an integer...
+    if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
+      return NaN;
+    }
+    // If the value is negative...
+    if (value < 0) {
+      return -decimalAdjust(type, -value, exp);
+    }
+    // Shift
+    value = value.toString().split('e');
+    value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
+    // Shift back
+    value = value.toString().split('e');
+    return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
+  }
+
+  // Decimal round
+  if (!Math.round10) {
+    Math.round10 = function(value, exp) {
+      return decimalAdjust('round', value, exp);
+    };
+  }
+  // Decimal floor
+  if (!Math.floor10) {
+    Math.floor10 = function(value, exp) {
+      return decimalAdjust('floor', value, exp);
+    };
+  }
+  // Decimal ceil
+  if (!Math.ceil10) {
+    Math.ceil10 = function(value, exp) {
+      return decimalAdjust('ceil', value, exp);
+    };
+  }
+})();
+
+// Round
+Math.round10(55.55, -1);   // 55.6
+Math.round10(55.549, -1);  // 55.5
+Math.round10(55, 1);       // 60
+Math.round10(54.9, 1);     // 50
+Math.round10(-55.55, -1);  // -55.5
+Math.round10(-55.551, -1); // -55.6
+Math.round10(-55, 1);      // -50
+Math.round10(-55.1, 1);    // -60
+Math.round10(1.005, -2);   // 1.01 -- compare this with Math.round(1.005*100)/100 above
+Math.round10(-1.005, -2);  // -1.01
+// Floor
+Math.floor10(55.59, -1);   // 55.5
+Math.floor10(59, 1);       // 50
+Math.floor10(-55.51, -1);  // -55.6
+Math.floor10(-51, 1);      // -60
+// Ceil
+Math.ceil10(55.51, -1);    // 55.6
+Math.ceil10(51, 1);        // 60
+Math.ceil10(-55.59, -1);   // -55.5
+Math.ceil10(-59, 1);       // -50
+
+ +

PHP-Like rounding Method

+ +

The code below can be used to add your own version of Math.round to your own namespace which takes a precision parameter. Unlike Decimal rounding in the example above, this performs no conversion to and from strings, and the precision parameter works same way as PHP and Excel whereby a positive 1 would round to 1 decimal place and -1 would round to the tens.

+ +
var myNamespace = {};
+
+myNamespace.round = function(number, precision) {
+    var factor = Math.pow(10, precision);
+    var tempNumber = number * factor;
+    var roundedTempNumber = Math.round(tempNumber);
+    return roundedTempNumber / factor;
+};
+
+myNamespace.round(1234.5678, 1); // 1234.6
+myNamespace.round(1234.5678, -1); // 1230
+ +

Cпецифікації

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення. Впроваджено в JavaScript 1.0.
{{SpecName('ES5.1', '#sec-15.8.2.15', 'Math.round')}}{{Spec2('ES5.1')}} 
{{SpecName('ES6', '#sec-math.round', 'Math.round')}}{{Spec2('ES6')}} 
{{SpecName('ESDraft', '#sec-math.round', 'Math.round')}}{{Spec2('ESDraft')}} 
+ +

Сумісність браузерів

+ + + +

{{Compat("javascript.builtins.Math.round")}}

+ +

Дивіться також

+ + diff --git "a/files/uk/web/javascript/reference/global_objects/math/\320\267\320\260\320\276\320\272\321\200\321\203\320\263\320\265\320\273\320\275\320\275\321\217/index.html" "b/files/uk/web/javascript/reference/global_objects/math/\320\267\320\260\320\276\320\272\321\200\321\203\320\263\320\265\320\273\320\275\320\275\321\217/index.html" deleted file mode 100644 index 92cc055f83..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/math/\320\267\320\260\320\276\320\272\321\200\321\203\320\263\320\265\320\273\320\275\320\275\321\217/index.html" +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: Math.round() -slug: Web/JavaScript/Reference/Global_Objects/Math/заокругелння -tags: - - JavaScript - - Math - - Довідка - - Заокруглення - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Math/round ---- -
{{JSRef}}
- -

Функція Math.round() повертає значення числа заокруглене до найближчого цілого.

- -

 

- -
{{EmbedInteractiveExample("pages/js/math-round.html")}}
- - - -

 

- -

Синтаксис

- -
Math.round(x)
- -

Параметри

- -
-
x
-
Число.
-
- -

Повернуте значення

- -

Значення отриманого числа, округлене до найближчого цілого.

- -

Опис

- -

Якщо дробова частина числа більша або рівна 0.5, аргумент буде округлено до найближчого більшого цілого. Якщо дробова частина числа менша 0.5, аргумент буде округлено до найближчого меншого цілого. Якщо дробова частина рівна 0.5, то аргумент буде округлено до найближчого цілого в напрямку +∞.  Зверніть увагу, що функція round() відрізняється від багатьох мов, які часто приводять цей випадок до наступного цілого числа, віддаленого від нуля (маємо інший результат у випадку від'ємних чисел з дробовою частиною рівною 0.5).

- -

Оскільки round() - це статичний метод Math, ви завжди використовуєте його як Math.round (), а не як метод об'єкта Math, який ви створили (Math не має конструктора).

- -

Приклади

- -
Math.round( 20.49); //  20
-Math.round( 20.5);  //  21
-Math.round( 42  );  //  42
-Math.round(-20.5);  // -20
-Math.round(-20.51); // -21
-
- -

Десяткове округлення

- -
// Closure
-(function() {
-  /**
-   * Decimal adjustment of a number.
-   *
-   * @param {String}  type  The type of adjustment.
-   * @param {Number}  value The number.
-   * @param {Integer} exp   The exponent (the 10 logarithm of the adjustment base).
-   * @returns {Number} The adjusted value.
-   */
-  function decimalAdjust(type, value, exp) {
-    // If the exp is undefined or zero...
-    if (typeof exp === 'undefined' || +exp === 0) {
-      return Math[type](value);
-    }
-    value = +value;
-    exp = +exp;
-    // If the value is not a number or the exp is not an integer...
-    if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
-      return NaN;
-    }
-    // If the value is negative...
-    if (value < 0) {
-      return -decimalAdjust(type, -value, exp);
-    }
-    // Shift
-    value = value.toString().split('e');
-    value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
-    // Shift back
-    value = value.toString().split('e');
-    return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
-  }
-
-  // Decimal round
-  if (!Math.round10) {
-    Math.round10 = function(value, exp) {
-      return decimalAdjust('round', value, exp);
-    };
-  }
-  // Decimal floor
-  if (!Math.floor10) {
-    Math.floor10 = function(value, exp) {
-      return decimalAdjust('floor', value, exp);
-    };
-  }
-  // Decimal ceil
-  if (!Math.ceil10) {
-    Math.ceil10 = function(value, exp) {
-      return decimalAdjust('ceil', value, exp);
-    };
-  }
-})();
-
-// Round
-Math.round10(55.55, -1);   // 55.6
-Math.round10(55.549, -1);  // 55.5
-Math.round10(55, 1);       // 60
-Math.round10(54.9, 1);     // 50
-Math.round10(-55.55, -1);  // -55.5
-Math.round10(-55.551, -1); // -55.6
-Math.round10(-55, 1);      // -50
-Math.round10(-55.1, 1);    // -60
-Math.round10(1.005, -2);   // 1.01 -- compare this with Math.round(1.005*100)/100 above
-Math.round10(-1.005, -2);  // -1.01
-// Floor
-Math.floor10(55.59, -1);   // 55.5
-Math.floor10(59, 1);       // 50
-Math.floor10(-55.51, -1);  // -55.6
-Math.floor10(-51, 1);      // -60
-// Ceil
-Math.ceil10(55.51, -1);    // 55.6
-Math.ceil10(51, 1);        // 60
-Math.ceil10(-55.59, -1);   // -55.5
-Math.ceil10(-59, 1);       // -50
-
- -

PHP-Like rounding Method

- -

The code below can be used to add your own version of Math.round to your own namespace which takes a precision parameter. Unlike Decimal rounding in the example above, this performs no conversion to and from strings, and the precision parameter works same way as PHP and Excel whereby a positive 1 would round to 1 decimal place and -1 would round to the tens.

- -
var myNamespace = {};
-
-myNamespace.round = function(number, precision) {
-    var factor = Math.pow(10, precision);
-    var tempNumber = number * factor;
-    var roundedTempNumber = Math.round(tempNumber);
-    return roundedTempNumber / factor;
-};
-
-myNamespace.round(1234.5678, 1); // 1234.6
-myNamespace.round(1234.5678, -1); // 1230
- -

Cпецифікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення. Впроваджено в JavaScript 1.0.
{{SpecName('ES5.1', '#sec-15.8.2.15', 'Math.round')}}{{Spec2('ES5.1')}} 
{{SpecName('ES6', '#sec-math.round', 'Math.round')}}{{Spec2('ES6')}} 
{{SpecName('ESDraft', '#sec-math.round', 'Math.round')}}{{Spec2('ESDraft')}} 
- -

Сумісність браузерів

- - - -

{{Compat("javascript.builtins.Math.round")}}

- -

Дивіться також

- - diff --git a/files/uk/web/javascript/reference/global_objects/number/epsilon/index.html b/files/uk/web/javascript/reference/global_objects/number/epsilon/index.html new file mode 100644 index 0000000000..18655cd15d --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/epsilon/index.html @@ -0,0 +1,67 @@ +--- +title: Number.EPSILON +slug: Web/JavaScript/Reference/Global_Objects/Число/EPSILON +tags: + - ECMAScript 2015 + - JavaScript + - Number + - Властивість + - Поле +translation_of: Web/JavaScript/Reference/Global_Objects/Number/EPSILON +--- +
{{JSRef}}
+ +

Властивість Number.EPSILON відображає різницю між 1 та найменшим числом із рухомою крапкою, що більше за 1.

+ +

Для доступу до цієї статичної властивості не потрібно створювати об'єкт {{jsxref("Число","Number")}} (використовуйте Number.EPSILON).

+ +
{{EmbedInteractiveExample("pages/js/number-epsilon.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Властивість EPSILON має значення, близьке до 2.2204460492503130808472633361816E-16, або ж 2-52.

+ +

Поліфіл

+ +
if (Number.EPSILON === undefined) {
+    Number.EPSILON = Math.pow(2, -52);
+}
+ +

Приклади

+ +

Перевірка рівності

+ +
x = 0.2;
+y = 0.3;
+z = 0.1;
+equal = (Math.abs(x - y + z) < Number.EPSILON);
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.epsilon', 'Number.EPSILON')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.EPSILON")}}

+ +

Дивіться також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/index.html b/files/uk/web/javascript/reference/global_objects/number/index.html new file mode 100644 index 0000000000..44ee101d87 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/index.html @@ -0,0 +1,186 @@ +--- +title: Number +slug: Web/JavaScript/Reference/Global_Objects/Число +tags: + - JavaScript + - Number + - Довідка + - Клас +translation_of: Web/JavaScript/Reference/Global_Objects/Number +--- +
{{JSRef}}
+ +

Об'єкт Number у JavaScript — це об'єкт-обгортка, що дозволяє працювати з числовими значеннями, такими як 37 чи -9.25.

+ +

Конструктор Number містить константи та методи для роботи з числами. Значення інших типів можуть бути перетворені на числа за допомогою функції Number().

+ +

Тип Number у JavaScript є 64-бітним значенням подвійної точності формату IEEE 754, як double у Java чи у C#. Це означає, що воно може відображати дробові значення, але існують певні обмеження на те, що воно може зберігати. Тип Number зберігає лише близько 17 десяткових знаків точності; числа підлягають округленню. Найбільше значення, яке може зберігати Number, дорівнює приблизно 1.8×10308. Числа за межами цього значення замінюються на спеціальну числову константу {{jsxref("Infinity")}}.

+ +

Числові літерали, такі як 37, у коді JavaScript є числами з рухомою крапкою, а не цілими числами. Не існує окремого цілочисельного типу у звичайному повсякденному використанні. (JavaScript нині має тип {{jsxref("BigInt")}}, але він був створений не того, щоб замінити Number у повсякденному використанні. 37 досі належить до типу Number, а не до BigInt.)

+ +

Числа також можна виразити у таких літеральних формах, як 0b1010o130x0A. Дізнайтесь більше щодо лексичної граматики чисел тут.

+ +

Опис

+ +

При використанні в якості функції, Number(value) перетворює рядок чи інше значення на тип Number. Якщо значення не можна перетворити, повертається {{jsxref("NaN")}}.

+ +

Літеральний синтаксис

+ +
123    // сто двадцять три
+123.0  // те саме
+123 === 123.0  // true
+ +

Синтаксис функції

+ +
Number('123')  // вертає число 123
+Number('123') === 123  // true
+
+Number("коник")    // NaN
+Number(undefined)  // NaN
+ +

Конструктор

+ +
+
Number()
+
Створює нове значення Number.
+
+ +

Статичні властивості

+ +
+
{{jsxref("Число.EPSILON", "Number.EPSILON")}}
+
Найменша можлива різниця між двома числами.
+
{{jsxref("Число.MAX_SAFE_INTEGER", "Number.MAX_SAFE_INTEGER")}}
+
Найбільше безпечне ціле число у JavaScript (253 - 1).
+
{{jsxref("Число.MAX_VALUE", "Number.MAX_VALUE")}}
+
Найбільше додатне число, доступне для відображення.
+
{{jsxref("Число.MIN_SAFE_INTEGER", "Number.MIN_SAFE_INTEGER")}}
+
Найменше безпечне ціле число у JavaScript (-(253 - 1)).
+
{{jsxref("Число.MIN_VALUE", "Number.MIN_VALUE")}}
+
Найменше додатне число, доступне для відображення, — найближче до нуля (за винятком самого нуля) додатне число.
+
{{jsxref("Число.NaN", "Number.NaN")}}
+
Спеціальне значення "{{glossary("NaN", "не число")}}".
+
{{jsxref("Число.NEGATIVE_INFINITY", "Number.NEGATIVE_INFINITY")}}
+
Спеціальне значення, що відображає від'ємну нескінченність. Повертається при переповненні.
+
{{jsxref("Число.POSITIVE_INFINITY", "Number.POSITIVE_INFINITY")}}
+
Спеціальне значення, що відображає нескінченність. Повертається при переповненні.
+
{{jsxref("Число.prototype", "Number.prototype")}}
+
Дозволяє додавати властивості до об'єкта Number.
+
+ +

Статичні методи

+ +
+
{{jsxref("Число.isNaN()", "Number.isNaN()")}}
+
Визначає, чи є передане значення NaN.
+
{{jsxref("Число.isFinite()", "Number.isFinite()")}}
+
Визначає, чи є передане значення скінченним числом.
+
{{jsxref("Число.isInteger()", "Number.isInteger()")}}
+
Визначає, чи є передане значення цілим числом.
+
{{jsxref("Число.isSafeInteger()", "Number.isSafeInteger()")}}
+
Визначає, чи є передане значення безпечним цілим числом (число між -(253 - 1) та 253 - 1).
+
{{jsxref("Число.parseFloat()", "Number.parseFloat()")}}
+
Те саме, що й глобальна функція {{jsxref("parseFloat", "parseFloat()")}}.
+
{{jsxref("Число.parseInt()", "Number.parseInt()")}}
+
Те саме, що й глобальна функція {{jsxref("parseInt", "parseInt()")}}.
+
+ +

Методи екземплярів

+ +
+
{{jsxref("Число.prototype.toExponential()", "Number.prototype.toExponential(дробовіЦифри)")}}
+
Повертає рядок, що містить експоненціальний запис числа.
+
{{jsxref("Число.prototype.toFixed()", "Number.prototype.toFixed(цифри)")}}
+
Повертає рядок, що містить запис числа у форматі з нерухомою крапкою.
+
{{jsxref("Число.prototype.toLocaleString()", "Number.prototype.toLocaleString([мови [, параметри]])")}}
+
Повертає рядок, що містить узалежнений від мови запис числа. Заміщує метод {{jsxref("Object.prototype.toLocaleString()")}}.
+
{{jsxref("Число.prototype.toPrecision()", "Number.prototype.toPrecision(точність)")}}
+
Повертає рядок, що містить запис числа із зазначеною точністю у форматі з нерухомою крапкою або у експоненціальному форматі.
+
{{jsxref("Число.prototype.toString()", "Number.prototype.toString([основа])")}}
+
Повертає рядкове представлення наданого об'єкта у вказаній системі числення. Заміщує метод {{jsxref("Object.prototype.toString()")}}.
+
{{jsxref("Число.prototype.valueOf()", "Number.prototype.valueOf()")}}
+
Повертає просте числове значення об'єкта. Заміщує метод {{jsxref("Object.prototype.valueOf()")}}.
+
+ +
+ +

Приклади

+ +

Використання об'єкта Number для присвоєння змінним числових значень

+ +

Наведений приклад використовує властивості об'єкта Number, щоб присвоїти кільком змінним числові значення:

+ +
const biggestNum     = Number.MAX_VALUE
+const smallestNum    = Number.MIN_VALUE
+const infiniteNum    = Number.POSITIVE_INFINITY
+const negInfiniteNum = Number.NEGATIVE_INFINITY
+const notANum        = Number.NaN
+
+ +

Діапазон цілих чисел для Number

+ +

У наступному прикладі наведено мінімальне та максимальне цілочисельне значення, які можуть бути відображені об'єктом Number (за детальною інформацією звертайтесь до стандарту ECMAScript, розділ 6.1.6 Тип Number):

+ +
const biggestInt = Number.MAX_SAFE_INTEGER   //  (253 - 1) =>  9007199254740991
+const smallestInt = Number.MIN_SAFE_INTEGER  // -(253 - 1) => -9007199254740991
+ +

При розборі даних, поданих у форматі JSON, цілі числа, що виходять за межі цього діапазону, можуть виявитися пошкодженими, коли аналізатор JSON примусово перетворює їх у тип Number.

+ +

Цьому можна запобігти використанням ({{jsxref("String","рядків")}}).

+ +

Більші числа можуть бути відображені за допомогою типу {{jsxref("BigInt")}}.

+ +

Використання Number для перетворення об'єкта Date

+ +

У наведеному прикладі об'єкт класу {{jsxref ("Date")}} перетворюється на числове значення за допомогою функції Number:

+ +
let d = new Date('December 17, 1995 03:24:00')
+console.log(Number(d))
+
+ +

Це виведе 819199440000.

+ +

Перетворення числових рядків та null на числа

+ +
Number('123')     // 123
+Number('123') === 123 /// true
+Number('12.3')    // 12.3
+Number('12.00')   // 12
+Number('123e-1')  // 12.3
+Number('')        // 0
+Number(null)      // 0
+Number('0x11')    // 17
+Number('0b11')    // 3
+Number('0o11')    // 9
+Number('foo')     // NaN
+Number('100a')    // NaN
+Number('-Infinity') //-Infinity
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number-objects', 'Number')}}
+ +

Підтримка веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.Number")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/isfinite/index.html b/files/uk/web/javascript/reference/global_objects/number/isfinite/index.html new file mode 100644 index 0000000000..8379f3d5c3 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/isfinite/index.html @@ -0,0 +1,86 @@ +--- +title: Number.isFinite() +slug: Web/JavaScript/Reference/Global_Objects/Число/isFinite +tags: + - JavaScript + - Number + - Довідка + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Number/isFinite +--- +
{{JSRef}}
+ +

Метод Number.isFinite() визначає, чи є передане значення скінченним числом.

+ +
{{EmbedInteractiveExample("pages/js/number-isfinite.html")}}
+ + + +

Синтаксис

+ +
Number.isFinite(value)
+ +

Параметри

+ +
+
value
+
Значення, яке треба перевірити на скінченність.
+
+ +

Значення, що повертається

+ +

Значення {{jsxref("Boolean")}}, що вказує, чи є надане значення скінченним числом.

+ +

Опис

+ +

У порівнянні з глобальною функцією {{jsxref("isFinite", "isFinite()")}}, цей метод не перетворює примусово значення параметра на число. Це означає, що тільки значення числового типу, які є скінченними, повернуть true.

+ +

Поліфіл

+ +
if (Number.isFinite === undefined) Number.isFinite = function(value) {
+    return typeof value === 'number' && isFinite(value);
+}
+
+ +

Приклади

+ +

Використання isFinite

+ +
Number.isFinite(Infinity);  // false
+Number.isFinite(NaN);       // false
+Number.isFinite(-Infinity); // false
+
+Number.isFinite(0);         // true
+Number.isFinite(2e64);      // true
+
+Number.isFinite('0');       // false, дорівнювало б true з
+                            // глобальною функцією isFinite('0')
+Number.isFinite(null);      // false, дорівнювало б true з
+                            // глобальною функцією isFinite(null)
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.isfinite', 'Number.isInteger')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.isFinite")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/isinteger/index.html b/files/uk/web/javascript/reference/global_objects/number/isinteger/index.html new file mode 100644 index 0000000000..3cd4988a2b --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/isinteger/index.html @@ -0,0 +1,94 @@ +--- +title: Number.isInteger() +slug: Web/JavaScript/Reference/Global_Objects/Число/isInteger +tags: + - JavaScript + - Number + - Довідка + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Number/isInteger +--- +
{{JSRef}}
+ +

Метод Number.isInteger() визначає, чи є передане значення цілим числом.

+ +
{{EmbedInteractiveExample("pages/js/number-isinteger.html")}}
+ + + +

Синтаксис

+ +
Number.isInteger(value)
+ +

Параметри

+ +
+
value
+
Значення для перевірки.
+
+ +

Повертає

+ +

Значення типу {{jsxref("Boolean")}}, що вказує, чи є надане значення цілим числом.

+ +

Опис

+ +

Якщо параметр є цілим числом, повертає true, інакше вертає false. Якщо значення дорівнює {{jsxref("NaN")}} або {{jsxref("Infinity")}}, повертає false. Цей метод також повертає true для чисел з плаваючою крапкою, які можуть бути представлені як цілі.

+ +

Поліфіл

+ +
Number.isInteger = Number.isInteger || function(value) {
+  return typeof value === 'number' &&
+    isFinite(value) &&
+    Math.floor(value) === value;
+};
+ +

Приклади

+ +

Використання isInteger

+ +
Number.isInteger(0);         // true
+Number.isInteger(1);         // true
+Number.isInteger(-100000);   // true
+Number.isInteger(99999999999999999999999); // true
+
+Number.isInteger(0.1);       // false
+Number.isInteger(Math.PI);   // false
+
+Number.isInteger(NaN);       // false
+Number.isInteger(Infinity);  // false
+Number.isInteger(-Infinity); // false
+Number.isInteger('10');      // false
+Number.isInteger(true);      // false
+Number.isInteger(false);     // false
+Number.isInteger([1]);       // false
+
+Number.isInteger(5.0);       // true
+Number.isInteger(5.000000000000001); // false
+Number.isInteger(5.0000000000000001); // true
+
+ +

Специфікації

+ + + + + + + + + + +
Specification
{{SpecName('ESDraft', '#sec-number.isinteger', 'Number.isInteger')}}
+ +

Підтримка веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.isInteger")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/isnan/index.html b/files/uk/web/javascript/reference/global_objects/number/isnan/index.html new file mode 100644 index 0000000000..c9c38ad05d --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/isnan/index.html @@ -0,0 +1,100 @@ +--- +title: Number.isNaN() +slug: Web/JavaScript/Reference/Global_Objects/Число/isNaN +tags: + - ECMAScript 2015 + - JavaScript + - Number + - isNaN + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Number/isNaN +--- +
{{JSRef}}
+ +

Метод Number.isNaN() визначає, чи є передане значення {{jsxref("NaN")}}, а його типом - {{jsxref("Число", "Number")}}. Це більш надійна версія оригіналу, глобального методу {{jsxref("isNaN", "isNaN()")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-isnan.html", "taller")}}
+ + + +

Синтаксис

+ +
Number.isNaN(value)
+ +

Параметри

+ +
+
value
+
Значення, що перевірятиметься на {{jsxref("NaN")}}.
+
+ +

Значення, що повертається

+ +

true, якщо надане значення є {{jsxref("NaN")}}, а його типом - {{jsxref("Число", "Number")}}; інакше, false.

+ +

Опис

+ +

Через те, що обидва оператори рівності, {{jsxref("Operators/Equality", "==")}} та {{jsxref("Operators/Strict_equality", "===")}}, повертають false при перевірці, чи {{jsxref("NaN")}} дорівнює {{jsxref("NaN")}}, виникла необхідність у функції Number.isNaN(). Ця ситуація відрізняється від усіх інших можливих порівнянь у JavaScript.

+ +

У порівнянні з глобальною функцією {{jsxref("isNaN", "isNaN()")}}, Number.isNaN() не має проблеми з примусовим приведенням параметра до числа. Це означає, що тепер стало безпечно передавати значення, які були б перетворені на {{jsxref("NaN")}}, але, насправді, не є значеннями {{jsxref("NaN")}}. Це також означає, що лише значення числового типу, які також є {{jsxref("NaN")}}, вертають true.

+ +

Поліфіл

+ +

Наступний код працює, тому що NaN є єдиним значенням у JavaScript, яке не дорівнює самому собі.

+ +
Number.isNaN = Number.isNaN || function isNaN(input) {
+    return typeof input === 'number' && input !== input;
+}
+
+ +

Приклади

+ +

Використання isNaN

+ +
Number.isNaN(NaN);        // true
+Number.isNaN(Number.NaN); // true
+Number.isNaN(0 / 0);      // true
+
+// наприклад, це дорівнювало б true у глобальному методі isNaN()
+Number.isNaN('NaN');      // false
+Number.isNaN(undefined);  // false
+Number.isNaN({});         // false
+Number.isNaN('ляля');     // false
+
+// Це все вертає false
+Number.isNaN(true);
+Number.isNaN(null);
+Number.isNaN(37);
+Number.isNaN('37');
+Number.isNaN('37.37');
+Number.isNaN('');
+Number.isNaN(' ');
+
+ +

Специфікації

+ + + + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.isnan', 'Number.isnan')}}
+ +

Сумісність з веб-переглядачами

+ + + +
{{Compat("javascript.builtins.Number.isNaN")}}
+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/issafeinteger/index.html b/files/uk/web/javascript/reference/global_objects/number/issafeinteger/index.html new file mode 100644 index 0000000000..8ff3f1fa81 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/issafeinteger/index.html @@ -0,0 +1,95 @@ +--- +title: Number.isSafeInteger() +slug: Web/JavaScript/Reference/Global_Objects/Число/isSafeInteger +tags: + - ECMAScript 2015 + - JavaScript + - Number + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger +--- +
{{JSRef}}
+ +

Метод Number.isSafeInteger() визначає, чи є надане значення безпечним цілим числом.

+ +
{{EmbedInteractiveExample("pages/js/number-issafeinteger.html")}}
+ + + +

Безпечним цілим числом вважається ціле число, яке

+ + + +

Наприклад, 253 - 1 є безпечним цілим числом: воно може бути точно відображене, і жодне інше ціле число не округлюється до нього в будь-якому режимі округлення IEEE-754. Для контрасту, 253 не є безпечним цілим числом: воно може бути точно відображене у IEEE-754, але ціле число 253 + 1 не може бути безпосередньо відображене у IEEE-754, а, натомість, округлюється до 253 під час округлення до найближчого цілого та округлення до меншого за модулем. Безпечні цілі числа включають усі цілі числа від -(253 - 1) включно до 253 - 1 включно (± 9007199254740991 або ± 9,007,199,254,740,991).  

+ +

Робота зі значеннями, більшими чи меншими за ~9 квадрільйонів, з повною точністю вимагає використання бібліотеки для арифметики довільної точності. Дивіться Що необхідно знати кожному програмісту про арифметику чисел з рухомою крапкою, щоб дізнатись більше щодо відображення чисел з рухомою крапкою.

+ +

Для більших чисел розгляньте використання типу {{jsxref("BigInt")}}.

+ +

Синтаксис

+ +
Number.isSafeInteger(testValue)
+
+ +

Параметри

+ +
+
testValue
+
Значення, що перевірятиметься на відповідність безпечному цілому числу.
+
+ +

Значення, що повертається

+ +

Значення {{jsxref("Boolean")}}, яке вказує, чи є надане значення безпечним цілим числом.

+ +

Поліфіл

+ +
Number.isSafeInteger = Number.isSafeInteger || function (value) {
+   return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
+};
+
+ +

Приклади

+ +

Використання isSafeInteger

+ +
Number.isSafeInteger(3);                    // true
+Number.isSafeInteger(Math.pow(2, 53));      // false
+Number.isSafeInteger(Math.pow(2, 53) - 1);  // true
+Number.isSafeInteger(NaN);                  // false
+Number.isSafeInteger(Infinity);             // false
+Number.isSafeInteger('3');                  // false
+Number.isSafeInteger(3.1);                  // false
+Number.isSafeInteger(3.0);                  // true
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.issafeinteger', 'Number.isSafeInteger')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.isSafeInteger")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/max_safe_integer/index.html b/files/uk/web/javascript/reference/global_objects/number/max_safe_integer/index.html new file mode 100644 index 0000000000..c104719e79 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/max_safe_integer/index.html @@ -0,0 +1,78 @@ +--- +title: Number.MAX_SAFE_INTEGER +slug: Web/JavaScript/Reference/Global_Objects/Число/MAX_SAFE_INTEGER +tags: + - ECMAScript 2015 + - JavaScript + - Number + - Властивість + - Поле +translation_of: Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER +--- +
{{JSRef}}
+ +

Стала Number.MAX_SAFE_INTEGER відображає найбільше безпечне ціле числове значення у JavaScript (253 - 1).

+ +

Для більших цілих значень використовуйте {{jsxref("BigInt")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-maxsafeinteger.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Стала MAX_SAFE_INTEGER має значення 9007199254740991 (9,007,199,254,740,991 або ~9 квадриліонів). Причина в тому, що JavaScript використовує формат чисел з рухомою крапкою подвійної точності, як зазначено у IEEE 754, та може безпечно відображати числа лише в діапазоні між -(253 - 1) та 253 - 1.

+ +

"Безпечний" в даному контексті означає можливість точно відображати та коректно порівнювати цілі числа. Наприклад,  Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 поверне true, що, з математичної точки зору, неправильно. Дивіться більше на сторінці {{jsxref("Number.isSafeInteger()")}}.

+ +

Це поле не існує у старих переглядачах. Його використання без перевірки його наявності, як ось Math.max(Number.MAX_SAFE_INTEGER, 2), видасть небажаний результат, такий як NaN.

+ +

У зв'язку з тим, що MAX_SAFE_INTEGER є статичною властивістю {{jsxref("Число","Number")}}, слід завжди викликати її як Number.MAX_SAFE_INTEGER, аніж як метод створеного вами об'єкта {{jsxref("Число","Number")}}.

+ +

Поліфіл

+ +
if (!Number.MAX_SAFE_INTEGER) {
+    Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
+}
+ +

Приклади

+ +

Значення, яке вертає MAX_SAFE_INTEGER

+ +
Number.MAX_SAFE_INTEGER // 9007199254740991
+
+ +

Числа, більші за безпечне ціле значення

+ +

Цей код поверне 2, тому що у числах з плаваючою крапкою значенням є кінцева десяткова "1", за винятком випадків денормалізованих чисел, таких як нуль.

+ +
Number.MAX_SAFE_INTEGER * Number.EPSILON; // 2
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.max_safe_integer', 'Number.MAX_SAFE_INTEGER')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.MAX_SAFE_INTEGER")}}

+ +

Дивіться також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/max_value/index.html b/files/uk/web/javascript/reference/global_objects/number/max_value/index.html new file mode 100644 index 0000000000..3280fa0cd8 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/max_value/index.html @@ -0,0 +1,64 @@ +--- +title: Number.MAX_VALUE +slug: Web/JavaScript/Reference/Global_Objects/Число/MAX_VALUE +tags: + - JavaScript + - Number + - Властивість + - Довідка +translation_of: Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE +--- +
{{JSRef}}
+ +

Властивість Number.MAX_VALUE відображає максимальне числове значення, доступне для відображення у JavaScript.

+ +
{{EmbedInteractiveExample("pages/js/number-maxvalue.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Значення властивості MAX_VALUE приблизно дорівнює 1.79E+308, або 21024. Значення більші за MAX_VALUE, відображаються як {{jsxref("Infinity")}}.

+ +

Оскільки MAX_VALUE є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.MAX_VALUE, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}. 

+ +

Приклади

+ +

Використання MAX_VALUE

+ +

Наступний код перемножує два числових значення. Якщо результат менший чи дорівнює MAX_VALUE, викликається функція func1; інакше, викликається функція func2.

+ +
if (num1 * num2 <= Number.MAX_VALUE) {
+  func1();
+} else {
+  func2();
+}
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.max_value', 'Number.MAX_VALUE')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.MAX_VALUE")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/min_safe_integer/index.html b/files/uk/web/javascript/reference/global_objects/number/min_safe_integer/index.html new file mode 100644 index 0000000000..a8e0553753 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/min_safe_integer/index.html @@ -0,0 +1,62 @@ +--- +title: Number.MIN_SAFE_INTEGER +slug: Web/JavaScript/Reference/Global_Objects/Число/MIN_SAFE_INTEGER +tags: + - ECMAScript 2015 + - JavaScript + - Number + - Властивість +translation_of: Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER +--- +
{{JSRef}}
+ +

Константа Number.MIN_SAFE_INTEGER відображає мінімальне безпечне ціле числове значення у JavaScript (-(253 - 1)).

+ +

Для відображення менших чисел, використовуйте {{jsxref("BigInt")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-min-safe-integer.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Константа MIN_SAFE_INTEGER має значення -9007199254740991 (-9,007,199,254,740,991 або близько -9 квадрильйонів). Причина в тому, що JavaScript використовує формат чисел з рухомою крапкою подвійної точності, як зазначено у IEEE 754, та може безпечно відображати числа лише в діапазоні між -(253 - 1) та 253 - 1.  Дивіться більше інформації у {{jsxref("Number.isSafeInteger()")}}.

+ +

Оскільки MIN_SAFE_INTEGER є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.MIN_SAFE_INTEGER, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}.

+ +

Приклади

+ +

Використання MIN_SAFE_INTEGER

+ +
Number.MIN_SAFE_INTEGER // -9007199254740991
+-(Math.pow(2, 53) - 1)  // -9007199254740991
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.min_safe_integer', 'Number.MIN_SAFE_INTEGER')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.MIN_SAFE_INTEGER")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/min_value/index.html b/files/uk/web/javascript/reference/global_objects/number/min_value/index.html new file mode 100644 index 0000000000..83ded3444a --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/min_value/index.html @@ -0,0 +1,66 @@ +--- +title: Number.MIN_VALUE +slug: Web/JavaScript/Reference/Global_Objects/Число/MIN_VALUE +tags: + - JavaScript + - Number + - Властивість +translation_of: Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE +--- +
{{JSRef}}
+ +

Властивість Number.MIN_VALUE відображає найменше числове значення, доступне для відображення у JavaScript.

+ +
{{EmbedInteractiveExample("pages/js/number-min-value.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Властивість MIN_VALUE - це число, максимально близьке до 0, а не найменше від'ємне значення, яке може відобразити JavaScript.

+ +

MIN_VALUE має значення, що приблизно дорівнює 5e-324. Значення, менші за MIN_VALUE приводяться до 0 ("зникнення порядку").

+ +

Оскільки MIN_VALUE є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.MIN_VALUE, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}.

+ +

Приклади

+ +

Використання MIN_VALUE

+ +

Наступний код ділить одне числове значення на інше. Якщо результат більший чи дорівнює MIN_VALUE, викликається функція func1; інакше, викликається функція func2.

+ +
if (num1 / num2 >= Number.MIN_VALUE) {
+  func1();
+} else {
+  func2();
+}
+
+ +

Специфікації

+ + + + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.min_value', 'Number.MIN_VALUE')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.MIN_VALUE")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/nan/index.html b/files/uk/web/javascript/reference/global_objects/number/nan/index.html new file mode 100644 index 0000000000..10ad96c00a --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/nan/index.html @@ -0,0 +1,59 @@ +--- +title: Number.NaN +slug: Web/JavaScript/Reference/Global_Objects/Число/NaN +tags: + - JavaScript + - Number + - Властивість +translation_of: Web/JavaScript/Reference/Global_Objects/Number/NaN +--- +
{{JSRef}}
+ +

Властивість Number.NaN відображає "не число" (Not-A-Number). Є еквівалентом {{jsxref("NaN")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-nan.html")}}
+ +

Вам не потрібно створювати об'єкт {{jsxref("Число", "Number")}}, щоб звертатись до статичної властивості (використовуйте Number.NaN).

+ +
{{js_property_attributes(0, 0, 0)}}
+ +

Приклади

+ +

Перевірка на числове значення

+ +
function sanitise(x) {
+  if (isNaN(x)) {
+    return Number.NaN;
+  }
+  return x;
+}
+ +

Перевірка на NaN

+ +

Дивіться Перевірку на NaN на сторінці NaN.

+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.nan', 'Number.NaN')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.NaN")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/negative_infinity/index.html b/files/uk/web/javascript/reference/global_objects/number/negative_infinity/index.html new file mode 100644 index 0000000000..aeab7dfa10 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/negative_infinity/index.html @@ -0,0 +1,82 @@ +--- +title: Number.NEGATIVE_INFINITY +slug: Web/JavaScript/Reference/Global_Objects/Число/NEGATIVE_INFINITY +tags: + - JavaScript + - Number + - Властивість + - Довідка +translation_of: Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY +--- +
{{JSRef}}
+ +

Властивість Number.NEGATIVE_INFINITY відображає значення від'ємної нескінченності.

+ +
{{EmbedInteractiveExample("pages/js/number-negative-infinity.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Значення Number.NEGATIVE_INFINITY є таким самим, як від'ємне значення властивості {{jsxref("Infinity")}} глобального об'єкта.

+ +

Це значення поводиться дещо інакше, ніж математична нескінченність:

+ + + +

Ви можете скористатись властивістю Number.NEGATIVE_INFINITY, щоб позначити помилку в умові, яка повертає скінченне число у випадку успіху. Зауважте, однак, що метод {{jsxref("isFinite")}} в цьому випадку був би більш доречним.

+ +

Оскільки NEGATIVE_INFINITY є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.NEGATIVE_INFINITY, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}. 

+ +

Приклади

+ +

Використання NEGATIVE_INFINITY

+ +

У наступному прикладі змінній smallNumber присвоюється значення, яке є меншим за мінімальне. Коли виконується інструкція {{jsxref("Statements/if...else", "if")}}, smallNumber має значення -Infinity, отже smallNumber присвоюється більш кероване значення для продовження.

+ +
var smallNumber = (-Number.MAX_VALUE) * 2;
+
+if (smallNumber === Number.NEGATIVE_INFINITY) {
+  smallNumber = returnFinite();
+}
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.negative_infinity', 'Number.NEGATIVE_INFINITY')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.NEGATIVE_INFINITY")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/number/index.html b/files/uk/web/javascript/reference/global_objects/number/number/index.html new file mode 100644 index 0000000000..c1dd069e56 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/number/index.html @@ -0,0 +1,63 @@ +--- +title: Number() constructor +slug: Web/JavaScript/Reference/Global_Objects/Число/Number +tags: + - JavaScript + - Number + - Довідка + - Конструктор +translation_of: Web/JavaScript/Reference/Global_Objects/Number/Number +--- +
{{JSRef}}
+ +

Конструктор Number() створює об'єкт {{jsxref("Число", "Number")}}.

+ +

Синтаксис

+ +
new Number(value)
+
+ +

Параметри

+ +
+
value
+
Числове значення об'єкта, що створюється.
+
+ +

Приклади

+ +

Створення об'єктів Number

+ +
const a = new Number('123'); // a === 123 дорівнює false
+const b = Number('123');     // b === 123 дорівнює true
+a instanceof Number;         // дорівнює true
+b instanceof Number;         // дорівнює false
+ +

Специфікації

+ + + + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number-constructor', 'Number constructor')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.Number")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/parsefloat/index.html b/files/uk/web/javascript/reference/global_objects/number/parsefloat/index.html new file mode 100644 index 0000000000..81d55dcfc1 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/parsefloat/index.html @@ -0,0 +1,88 @@ +--- +title: Number.parseFloat() +slug: Web/JavaScript/Reference/Global_Objects/Число/parseFloat +tags: + - ECMAScript 2015 + - JavaScript + - Number + - метод + - число +translation_of: Web/JavaScript/Reference/Global_Objects/Number/parseFloat +--- +
{{JSRef}}
+ +

Метод Number.parseFloat() розбирає аргумент та повертає число з плаваючою крапкою. Якщо число неможливо розібрати з аргумента, повертає {{jsxref("NaN")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-parsefloat.html")}}
+ + + +

Синтаксис

+ +
Number.parseFloat(string)
+ +

Параметри

+ +
+
string
+
Значення, яке треба розібрати. Якщо цей аргумент не є рядком, то він приводиться до рядка за допомогою абстрактної операції ToString. {{glossary("whitespace", "Пробільний символ")}} на початку цього аргументу ігнорується.
+
+ +

Значення, що повертається

+ +

Число з плаваючою крапкою з наданого рядка string.

+ +

Або {{jsxref("NaN")}}, коли перший непробільний символ не може бути перетворений на число.

+ +

Поліфіл

+ +
if (Number.parseFloat === undefined) {
+  Number.parseFloat = parseFloat;
+}
+
+ +

Приклади

+ +

Number.parseFloat проти parseFloat

+ +

Цей метод має таку саму функціональність, як і глобальна функція {{jsxref("parseFloat", "parseFloat()")}}:

+ +
Number.parseFloat === parseFloat; // true
+
+ +

Цей метод також є частиною ECMAScript 2015. (Його метою є модуляризація глобальних елементів.)

+ +

Дивіться більше подробиць та приклади у {{jsxref("parseFloat", "parseFloat()")}}.

+ +

Специфікації

+ + + + + + + + + + + + +
Специфікації
{{SpecName('ESDraft', '#sec-number.parsefloat', 'Number.parseFloat')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.parseFloat")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/parseint/index.html b/files/uk/web/javascript/reference/global_objects/number/parseint/index.html new file mode 100644 index 0000000000..8bb6c28c80 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/parseint/index.html @@ -0,0 +1,83 @@ +--- +title: Number.parseInt() +slug: Web/JavaScript/Reference/Global_Objects/Число/parseInt +tags: + - ECMAScript 2015 + - JavaScript + - Number + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Number/parseInt +--- +
{{JSRef}}
+ +

Метод Number.parseInt() розбирає рядковий аргумент та повертає ціле число з вказаною основою системи числення.

+ +
{{EmbedInteractiveExample("pages/js/number-parseint.html", "taller")}}
+ + + +

Синтаксис

+ +
Number.parseInt(string,[ radix])
+ +

Параметри

+ +
+
+
string
+
Значення, яке розбиратиметься. Якщо цей аргумент не є рядком, то він приводиться до рядка за допомогою абстрактної операції ToString. Пробільний символ на початку цього аргументу ігнорується.
+
radix {{optional_inline}}
+
Ціле число між 2 та 36, яке вказує основу (в математичних системах числення) значення string. Будьте обережні — вона не дорівнює за замовчуванням 10!
+
+
+ +

Значення, що повертається

+ +

Ціле число, отримане з наданого рядка string.

+ +

Якщо значення radix менше за 2 чи більше за 36, а перший непробільний символ не може бути перетворений на число, повертається {{jsxref("NaN")}}.

+ +

Поліфіл

+ +
if (Number.parseInt === undefined) {
+    Number.parseInt = window.parseInt
+}
+
+ +

Приклади

+ +

Number.parseInt проти parseInt

+ +

Цей метод має таку саму функціональність, як і глобальна функція {{jsxref("parseInt", "parseInt()")}}:

+ +
Number.parseInt === parseInt // true
+ +

і є частиною ECMAScript 2015 (його метою є модуляризація глобальних елементів). Будь ласка, дивіться більше подробиць та прикладів у {{jsxref("parseInt", "parseInt()")}}.

+ +

Специфікації

+ + + + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.parseint', 'Number.parseInt')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.parseInt")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/positive_infinity/index.html b/files/uk/web/javascript/reference/global_objects/number/positive_infinity/index.html new file mode 100644 index 0000000000..5c22467fb7 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/positive_infinity/index.html @@ -0,0 +1,82 @@ +--- +title: Number.POSITIVE_INFINITY +slug: Web/JavaScript/Reference/Global_Objects/Число/POSITIVE_INFINITY +tags: + - JavaScript + - Number + - Властивість + - Довідка +translation_of: Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY +--- +
{{JSRef}}
+ +

Властивість Number.POSITIVE_INFINITY відображає значення позитивної нескінченності.

+ +
{{EmbedInteractiveExample("pages/js/number-positive-infinity.html")}}
+ + + +
{{js_property_attributes(0, 0, 0)}}
+ +

Опис

+ +

Значення Number.POSITIVE_INFINITY є таким самим, як і значення властивості глобального об'єкта {{jsxref("Infinity")}}.

+ +

Це значення поводиться дещо інакше, ніж математична нескінченність:

+ + + +

Ви можете скористатись властивістю Number.POSITIVE_INFINITY, щоб позначити помилку в умові, яка вертає скінченне число у випадку успіху. Зауважте, однак, що метод {{jsxref("isFinite")}} в цьому випадку більш доречний.

+ +

Оскільки POSITIVE_INFINITY є статичною властивістю об'єкта {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.POSITIVE_INFINITY, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}. 

+ +

Приклади

+ +

Використання POSITIVE_INFINITY

+ +

У наступному прикладі змінній bigNumber присвоюється значення, яке є більшим за максимальне. Коли виконується інструкція {{jsxref("Statements/if...else", "if")}}, bigNumber має значення Infinity, а отже, bigNumber присвоюється більш кероване значення для продовження.

+ +
var bigNumber = Number.MAX_VALUE * 2;
+
+if (bigNumber == Number.POSITIVE_INFINITY) {
+  bigNumber = returnFinite();
+}
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.positive_infinity', 'Number.POSITIVE_INFINITY')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.POSITIVE_INFINITY")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/toexponential/index.html b/files/uk/web/javascript/reference/global_objects/number/toexponential/index.html new file mode 100644 index 0000000000..9896ee2c95 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/toexponential/index.html @@ -0,0 +1,89 @@ +--- +title: Number.prototype.toExponential() +slug: Web/JavaScript/Reference/Global_Objects/Число/toExponential +tags: + - JavaScript + - Number + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/toExponential +--- +
{{JSRef}}
+ +

Метод toExponential() повертає рядок, що відображає об'єкт Number в експоненціальному позначенні.

+ +
{{EmbedInteractiveExample("pages/js/number-toexponential.html")}}
+ + + +

Синтаксис

+ +
numObj.toExponential([fractionDigits])
+ +

Параметри

+ +
+
fractionDigits
+
Необов'язковий параметр. Ціле число, яке визначає кількість цифр після десяткової крапки. За замовчуванням використовується стільки цифр, скільки необхідно для відображення числа.
+
+ +

Значення, що повертається

+ +

Рядок, що відображає об'єкт {{jsxref("Число", "Number")}} в експоненційному позначенні, з однією цифрою перед десятковою крапкою, округлене до fractionDigits цифр після крапки. 

+ +

Винятки

+ +
+
{{jsxref("RangeError")}}
+
Якщо значення fractionDigits занадто маленьке або занадто велике. Значення між 0 і 20, включно, не спричинять {{jsxref("RangeError")}}. Також реалізації можуть підтримувати більші та менші значення.
+
{{jsxref("TypeError")}}
+
Якщо цей метод викликається на об'єкті, який не є об'єктом {{jsxref("Число", "Number")}}.
+
+ +

Опис

+ +

Якщо аргумент fractionDigits не вказаний, кількість цифр після десяткової крапки за замовчуванням дорівнює кількості цифр, необхідній для унікального відображення значення.

+ +

Якщо ви використовуєте метод toExponential() на числовому літералі, і цей літерал не має експоненціального показника та десяткової крапки, залиште пробіл(и) перед крапкою, що передує виклику методу, щоб запобігти її інтерпретації як десяткової крапки.

+ +

Якщо число має більше цифр, ніж вимагає параметр fractionDigits, число округлюється до найближчого числа, представленого цифрами fractionDigits. Дивіться приклад округлення в описі методу {{jsxref("Number.prototype.toFixed", "toFixed()")}}, який також застосовується у toExponential().

+ +

Приклади

+ +

Використання toExponential

+ +
var numObj = 77.1234;
+
+console.log(numObj.toExponential());  // виводить 7.71234e+1
+console.log(numObj.toExponential(4)); // виводить 7.7123e+1
+console.log(numObj.toExponential(2)); // виводить 7.71e+1
+console.log(77.1234.toExponential()); // виводить 7.71234e+1
+console.log(77 .toExponential());     // виводить 7.7e+1
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.toexponential', 'Number.prototype.toExponential')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.toExponential")}}

+ +

Дивіться також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/tofixed/index.html b/files/uk/web/javascript/reference/global_objects/number/tofixed/index.html new file mode 100644 index 0000000000..a36e157a44 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/tofixed/index.html @@ -0,0 +1,95 @@ +--- +title: Number.prototype.toFixed() +slug: Web/JavaScript/Reference/Global_Objects/Число/toFixed +tags: + - JavaScript + - Number + - Довідка + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/toFixed +--- +
{{JSRef}}
+ +

Метод toFixed() форматує число, використовуючи позначення з нерухомою крапкою.

+ +
{{EmbedInteractiveExample("pages/js/number-tofixed.html")}}
+ + + +

Синтаксис

+ +
numObj.toFixed([digits])
+ +

Параметри

+ +
+
digits {{optional_inline}}
+
Кількість цифр після десяткової крапки; це має бути значення між 0 та 20, включно, а реалізації можуть за бажанням підтримувати ширший діапазон значень. Якщо цей аргумент пропущений, він вважається рівним 0.
+
+ +

Значення, що повертається

+ +

Рядок, що відображає надане число у форматі числа з нерухомою крапкою.

+ +

Винятки

+ +
+
{{jsxref("RangeError")}}
+
Якщо значення digits надто маленьке чи надто велике. Значення між 0 та 100, включно, не спричинять {{jsxref("RangeError")}}. Реалізаціям дозвонено підтримувати більші та менші значення, за вибором.
+
{{jsxref("TypeError")}}
+
Якщо цей метод вкликається на об'єкті, який не є об'єктом {{jsxref("Число", "Number")}}.
+
+ +

Опис

+ +

toFixed() вертає рядкове представлення об'єкта numObj, яке не використовує експоненціальне позначення і має рівно digits цифр після десяткової позиції. Число округлюється за необхідності, а дробова частина заповнюється нулями, якщо це необхідно для досягнення необхідної довжини. Якщо абсолютне значення numObj більше або дорівнює 1e+21, цей метод просто викликає {{jsxref("Number.prototype.toString()")}} та повертає рядок у експоненціальному позначенні.

+ +
+

Застереження: Числа з рухомою крапкою не здатні точно відображати усі десяткові числа у двійковому представленні. Це може призвести до неочікуваних результатів, наприклад 0.1 + 0.2 === 0.3, що вертає false .

+
+ +

Приклади

+ +

Використання toFixed

+ +
let numObj = 12345.6789
+
+numObj.toFixed()       // Вертає '12346': зверніть увагу на округлення, немає дробової частини
+numObj.toFixed(1)      // Вертає '12345.7': зверніть увагу на округлення
+numObj.toFixed(6)      // Вертає '12345.678900': зверніть увагу на додані нулі
+(1.23e+20).toFixed(2)  // Вертає '123000000000000000000.00'
+(1.23e-10).toFixed(2)  // Вертає '0.00'
+2.34.toFixed(1)        // Вертає '2.3'
+2.35.toFixed(1)        // Вертає '2.4'. Зауважте, округлюється вгору
+2.55.toFixed(1)        // Вертає '2.5'. Зауважте, округлюється вниз - дивіться застереження вище
+-2.34.toFixed(1)       // Вертає -2.3 (через пріоритет операторів, від'ємні числові літерали не повертають рядок...)
+(-2.34).toFixed(1)     // Вертає '-2.3'
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.tofixed', 'Number.prototype.toFixed')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.toFixed")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/tolocalestring/index.html b/files/uk/web/javascript/reference/global_objects/number/tolocalestring/index.html new file mode 100644 index 0000000000..a65659d7de --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/tolocalestring/index.html @@ -0,0 +1,154 @@ +--- +title: Number.prototype.toLocaleString() +slug: Web/JavaScript/Reference/Global_Objects/Число/toLocaleString +tags: + - JavaScript + - Number + - Інтернаціоналізація + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/toLocaleString +--- +
{{JSRef}}
+ +

Метод toLocaleString() повертає рядок, що відображає число у відповідності до налаштувань мови.

+ +
{{EmbedInteractiveExample("pages/js/number-tolocalestring.html")}}
+ + + +

Синтаксис

+ +
numObj.toLocaleString([locales [, options]])
+ +

Параметри

+ +

Аргументи locales та options налаштовують поведінку функції та дозволяють застосункам вказувати мову, чиї правила форматування мають застосовуватись. У тих реалізаціях, які ігнорують аргументи locales та options, локальні налаштування та форма поверненого рядка повністю залежать від реалізації.

+ +
Дивіться конструктор Intl.NumberFormat(), щоб дізнатись подробиці щодо цих параметрів та їхнього використання.
+ +

Значення, що повертається

+ +

Рядок, що відображає число у відповідності до налаштувань мови.

+ +

Швидкодія

+ +

При форматуванні великої кількості чисел краще створити об'єкт {{jsxref("NumberFormat")}} та використовувати функцію, надану його властивістю {{jsxref("NumberFormat.format")}}.

+ +

Приклади

+ +

Використання toLocaleString

+ +

При загальному використанні, без зазначення локалі, повертається рядок у мовному форматі, що стоїть за замовчуванням та з початковими параметрами.

+ +
var number = 3500;
+
+console.log(number.toLocaleString()); // Відображає "3,500" у форматі U.S. English
+
+ +

Перевірка підтримки аргументів locales та options

+ +

Аргументи locales та options ще не підтримуються в усіх переглядачах. Для перевірки їхньої підтримки у ES5.1 та новіших реалізаціях можна скористатись вимогою, згідно якої недозволені мовні позначення відхиляються з винятком {{jsxref("Global_Objects/RangeError", "RangeError")}}:

+ +
function toLocaleStringSupportsLocales() {
+  var number = 0;
+  try {
+    number.toLocaleString('i');
+  } catch (e) {
+    return e.name === 'RangeError';
+  }
+  return false;
+}
+
+ +

До ES5.1, реалізації не були зобов'язані викидати виняток з помилкою діапазону, якщо toLocaleString викликався з аргументами.

+ +

Перевірка, яка працює в усіх хостах, в тому числі тих, що підтримують ECMA-262 до версії 5.1, полягає в безпосередньому тестуванні функцій, визначених у ECMA-402 як такі, що зобов'язані підтримувати регіональні налаштування для Number.prototype.toLocaleString:

+ +
function toLocaleStringSupportsOptions() {
+  return !!(typeof Intl == 'object' && Intl && typeof Intl.NumberFormat == 'function');
+}
+
+ +

Цей код перевіряє наявність глобального об'єкта Intl, перевіряє, що він не дорівнює null та що він має властивість NumberFormat, яка є функцією.

+ +

Використання locales

+ +

Цей приклад демонструє деякі варіації локалізованих форматів чисел. Щоб отримати формат мови, задіяної в інтерфейсі вашого застосутку, переконайтесь, що вказали цю мову (та, можливо, кілька запасних мов) за допомогою аргументу locales:

+ +
var number = 123456.789;
+
+// В німецькій десятковим роздільником є кома, а крапка розділяє тисячі
+console.log(number.toLocaleString('de-DE'));
+// → 123.456,789
+
+// Арабська у більшості арабськомовних країн використовує Індо-арабські цифри
+console.log(number.toLocaleString('ar-EG'));
+// → ١٢٣٤٥٦٫٧٨٩
+
+// Індія використовує роздільники тисячі/лакх/крор
+console.log(number.toLocaleString('en-IN'));
+// → 1,23,456.789
+
+// ключ розширення nu налаштовує систему нумерації, наприклад, китайську десяткову
+console.log(number.toLocaleString('zh-Hans-CN-u-nu-hanidec'));
+// → 一二三,四五六.七八九
+
+// при запиті мови, яка, можливо, не підтримується, наприклад,
+// балійської, додайте запасні мови, в даному випадку це індонезійська
+console.log(number.toLocaleString(['ban', 'id']));
+// → 123.456,789
+ +

Використання options

+ +

Результат методу toLocaleString можна налаштувати за допомогою аргументу options:

+ +
var number = 123456.789;
+
+// налаштування формату валюти
+console.log(number.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' }));
+// → 123.456,79 €
+
+// японська єна не використовує дробові розряди
+console.log(number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }))
+// → ¥123,457
+
+// обмежити трьома значущими цифрами
+console.log(number.toLocaleString('en-IN', { maximumSignificantDigits: 3 }));
+// → 1,23,000
+
+// Використовувати мову системи з параметрами для форматування чисел
+var num = 30000.65;
+console.log(num.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
+// → "30,000.65" де мова системи англійська, або
+// → "30.000,65" де мова системи німецька, або
+// → "30 000,65" де мова системи французька
+
+ +

Специфікації

+ + + + + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.tolocalestring', 'Number.prototype.toLocaleString')}}
{{SpecName('ES Int Draft', '#sup-number.prototype.tolocalestring', 'Number.prototype.toLocaleString')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.toLocaleString")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/toprecision/index.html b/files/uk/web/javascript/reference/global_objects/number/toprecision/index.html new file mode 100644 index 0000000000..3c0ecefc4a --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/toprecision/index.html @@ -0,0 +1,88 @@ +--- +title: Number.prototype.toPrecision() +slug: Web/JavaScript/Reference/Global_Objects/Число/toPrecision +tags: + - JavaScript + - Number + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/toPrecision +--- +
{{JSRef}}
+ +

Метод toPrecision() вертає рядкове відображення об'єкта {{jsxref("Число", "Number")}} з вказаною точністю.

+ +
{{EmbedInteractiveExample("pages/js/number-toprecision.html")}}
+ +

Синтаксис

+ +
numObj.toPrecision([precision])
+ +

Параметри

+ +
+
precision {{optional_inline}}
+
Ціле число, що вказує кількість значущих цифр.
+
+ +

Значення, що повертається

+ +

Рядок, що відображає об'єкт {{jsxref("Число", "Number")}} у форматі з нерухомою крапкою або експоненціальному форматі, округлений до кількості значущих цифр precision. Дивіться обговорення округлення у описі методу {{jsxref("Number.prototype.toFixed()")}}, яке також застосовується в методі toPrecision().

+ +

Якщо аргумент precision не вказаний, метод поводиться як {{jsxref("Number.prototype.toString()")}}. Якщо аргумент precision не є цілочисельним значенням, воно округлюється до найближчого цілого числа.

+ +

Винятки

+ +
+
{{jsxref("Global_Objects/RangeError", "RangeError")}}
+
Якщо значення precision не знаходиться в діапазоні між 1 та 100 (включно), викидається {{jsxref("RangeError")}}. Реалізаціям дозволено підтримувати також більші та менші значення. ECMA-262 лише вимагає точності до 21 значущої цифри.
+
+ +

Приклади

+ +

Використання toPrecision

+ +
let numObj = 5.123456
+
+console.log(numObj.toPrecision())    // виводить '5.123456'
+console.log(numObj.toPrecision(5))   // виводить '5.1235'
+console.log(numObj.toPrecision(2))   // виводить '5.1'
+console.log(numObj.toPrecision(1))   // виводить '5'
+
+numObj = 0.000123
+
+console.log(numObj.toPrecision())    // виводить '0.000123'
+console.log(numObj.toPrecision(5))   // виводить '0.00012300'
+console.log(numObj.toPrecision(2))   // виводить '0.00012'
+console.log(numObj.toPrecision(1))   // виводить '0.0001'
+
+// зауважте, що в деяких обставинах може повернутись експоненціальний запис
+console.log((1234.5).toPrecision(2)) // виводить '1.2e+3'
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.toprecision', 'Number.prototype.toPrecision')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.toPrecision")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/tosource/index.html b/files/uk/web/javascript/reference/global_objects/number/tosource/index.html new file mode 100644 index 0000000000..55a86a9972 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/tosource/index.html @@ -0,0 +1,54 @@ +--- +title: Number.prototype.toSource() +slug: Web/JavaScript/Reference/Global_Objects/Число/toSource +tags: + - JavaScript + - Number + - застарілий + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/toSource +--- +
{{JSRef}} {{obsolete_header}}
+ +

Метод toSource() вертає рядкове представлення першокоду об'єкта.

+ +

Синтаксис

+ +
numObj.toSource()
+Number.toSource()
+ +

Значення, що вертається

+ +

Рядкове представлення першокоду об'єкта.

+ +

Приклади

+ +

Вбудована функція

+ +

Для вбудованого об'єкта {{jsxref("Число", "Number")}}, toSource() вертає наступний рядок, який вказує, що першокод недоступний:

+ +
function Number() {
+    [native code]
+}
+
+ +

Для екземплярів {{jsxref("Число", "Number")}}, toSource() вертає рядкове представлення першокоду.

+ +

Цей метод зазвичай викликається внутрішньо у JavaScript, а не явно у коді.

+ +

Специфікації

+ +

Не є частиною жодного стандарту.

+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.toSource")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/tostring/index.html b/files/uk/web/javascript/reference/global_objects/number/tostring/index.html new file mode 100644 index 0000000000..dcd4d82bb0 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/tostring/index.html @@ -0,0 +1,97 @@ +--- +title: Number.prototype.toString() +slug: Web/JavaScript/Reference/Global_Objects/Число/toString +tags: + - JavaScript + - Number + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/toString +--- +
{{JSRef}}
+ +

Метод toString() вертає рядкове представлення вказаного об'єкта {{jsxref("Число", "Number")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-tostring.html")}}
+ + + +

Синтаксис

+ +
numObj.toString([radix])
+ +

Параметри

+ +
+
radix
+
Необов'язковий. Ціле число в діапазоні від 2 до 36, яке вказує основу системи числення для відображення чисел.
+
+ +

Значення, що вертається

+ +

Рядкове представлення вказаного об'єкта {{jsxref("Число", "Number")}}.

+ +

Винятки

+ +
+
{{jsxref("RangeError")}}
+
Якщо методу toString() надано основу, меншу за 2 чи більшу за 36, викидається {{jsxref("RangeError")}}.
+
+ +

Опис

+ +

Об'єкт {{jsxref("Число", "Number")}} заміщує метод toString() об'єкта {{jsxref("Object")}}. (Він не успадковує {{jsxref("Object.prototype.toString()")}}). Для об'єктів {{jsxref("Число", "Number")}}, метод toString() вертає рядкове представлення об'єкта у вказаній системі числення.

+ +

Метод toString() розбирає перший аргумент та намагається повернути рядкове представлення числа з вказаною основою radix. Для основ, більших за 10, літери алфавіту вказують числа, більші за 9. Наприклад, для шістнадцяткових чисел (основа 16) використовуються літери від a до f.

+ +

Якщо аргумент radix не вказаний, основа вважається рівною 10.

+ +

Якщо значення numObj від'ємне, знак зберігається. Це відбувається, навіть якщо основа дорівнює 2; повернений рядок - це додатне двійкове представлення числа numObj зі знаком - попереду, а не numObj у форматі доповняльного коду.

+ +

Якщо numObj не є цілим числом, знак 'крапка' використовується для відділення десяткових знаків.

+ +

Приклади

+ +

Використання toString

+ +
let count = 10
+
+console.log(count.toString())    // виводить '10'
+console.log((17).toString())     // виводить '17'
+console.log((17.2).toString())   // виводить '17.2'
+
+let x = 6
+
+console.log(x.toString(2))       // виводить '110'
+console.log((254).toString(16))  // виводить 'fe'
+
+console.log((-10).toString(2))   // виводить '-1010'
+console.log((-0xff).toString(2)) // виводить '-11111111'
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.tostring', 'Number.prototype.tostring')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.toString")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/number/valueof/index.html b/files/uk/web/javascript/reference/global_objects/number/valueof/index.html new file mode 100644 index 0000000000..9ec495bfa3 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/number/valueof/index.html @@ -0,0 +1,67 @@ +--- +title: Number.prototype.valueOf() +slug: Web/JavaScript/Reference/Global_Objects/Число/valueOf +tags: + - JavaScript + - Number + - Довідка + - метод + - прототип +translation_of: Web/JavaScript/Reference/Global_Objects/Number/valueOf +--- +
{{JSRef}}
+ +

Метод valueOf() вертає загорнуте примітивне значення об'єкта {{jsxref("Число", "Number")}}.

+ +
{{EmbedInteractiveExample("pages/js/number-valueof.html")}}
+ + + +

Синтаксис

+ +
numObj.valueOf()
+ +

Значення, що вертається

+ +

Число, яке відображає примітивне значення вказаного об'єкта {{jsxref("Число", "Number")}}.

+ +

Опис

+ +

Цей метод, зазвичай, викликається внутрішньо у JavaScript, а не явно у коді.

+ +

Приклади

+ +

Використання valueOf

+ +
let numObj = new Number(10)
+console.log(typeof numObj)  // object
+
+let num = numObj.valueOf()
+console.log(num)            // 10
+console.log(typeof num)     // number
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.valueof', 'Number.prototype.valueOf')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Number.valueOf")}}

+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/global_objects/promise/prototype/index.html b/files/uk/web/javascript/reference/global_objects/promise/prototype/index.html deleted file mode 100644 index 33bdd86562..0000000000 --- a/files/uk/web/javascript/reference/global_objects/promise/prototype/index.html +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Promise.prototype -slug: Web/JavaScript/Reference/Global_Objects/Promise/prototype -tags: - - JavaScript - - Promise - - ДжаваСкріпт - - Проміс -translation_of: Web/JavaScript/Reference/Global_Objects/Promise -translation_of_original: Web/JavaScript/Reference/Global_Objects/Promise/prototype ---- -
{{JSRef}}
- -

Параметр Promise.prototype відображає прототип для конструктора {{jsxref("Promise")}} constructor.

- -
{{js_property_attributes(0,0,0)}}
- -

Опис

- -

Екземпляри {{jsxref("Promise")}} успадковуються від {{jsxref("Promise.prototype")}}. Ви можете використовувати прототип конструктора, щоб добавляти параметри або методи до всіх екземплярів Promise.

- -

Параметри

- -
-
Promise.prototype.constructor
-
Повертає функцію, яка створила прототип екземпляра. Це є функція {{jsxref("Promise")}} по замовчуванню.
-
- -

Методи

- -
-
{{jsxref("Promise.catch", "Promise.prototype.catch(onRejected)")}}
-
Добавляє колбек обробник відхилення проміса, і повертає новий проміс, який вирішується значенням, яке повертається з функції колбеку, якщо вона була викликана, або його початковий результат виконання, якщо даний проміс був виконаний.
-
{{jsxref("Promise.then", "Promise.prototype.then(onFulfilled, onRejected)")}}
-
Добавляє до проміса функції колбеки для випадків, коли проміс був виконаний (onFulfilled) і відхилений (onRejected) і повертає новий проміс, який вирішується значенням, яке було повернуто з onFulfilled функції колбеку, або з початковим значенням, яке було вирішено, коли даний проміс не був оброблений (тобто коли обробники onFulfilled або onRejected не є функцією).
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES6', '#sec-promise.prototype', 'Promise.prototype')}}{{Spec2('ES6')}}Початкове визначення.
{{SpecName('ESDraft', '#sec-promise.prototype', 'Promise.prototype')}}{{Spec2('ESDraft')}} 
- -

Сумісність із браузерами

- - - -

{{Compat("javascript/promise","Promise.prototype")}}

- -

Дивитися також

- - diff --git a/files/uk/web/javascript/reference/global_objects/promise/reject/index.html b/files/uk/web/javascript/reference/global_objects/promise/reject/index.html new file mode 100644 index 0000000000..406c6e74e2 --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/promise/reject/index.html @@ -0,0 +1,73 @@ +--- +title: Promise.reject() +slug: Web/JavaScript/Reference/Global_Objects/Promise/відхилено +tags: + - ECMAScript 2015 + - JavaScript + - Promise + - метод +translation_of: Web/JavaScript/Reference/Global_Objects/Promise/reject +--- +
{{JSRef}}
+ +

Метод Promise.reject() повертає об'єкт Promise, відхилений з наданою причиною.

+ +

{{EmbedInteractiveExample("pages/js/promise-reject.html")}}

+ + + +

Синтаксис

+ +
Promise.reject(reason);
+ +

Параметри

+ +
+
reason
+
Причина, чому даний проміс був відхилений.
+
+ +

Значення, яке повертається

+ +

Об'єкт {{jsxref("Promise")}}, відхилений з наданою причиною.

+ +

Опис

+ +

Статичний метод Promise.reject повертає відхилений об'єкт Promise. З метою відлагодження, а також вибіркового перехоплення помилок зручно використовувати reason як instanceof {{jsxref("Error")}}.

+ +

Приклади

+ +

Використання статичного методу Promise.reject()

+ +
Promise.reject(new Error('fail')).then(function(error) {
+  // не викликається
+}, function(error) {
+  console.error(error); // стек викликів
+});
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-promise.reject', 'Promise.reject')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.builtins.Promise.reject")}}

+ +

Дивіться також

+ + diff --git "a/files/uk/web/javascript/reference/global_objects/promise/\320\262\321\226\320\264\321\205\320\270\320\273\320\265\320\275\320\276/index.html" "b/files/uk/web/javascript/reference/global_objects/promise/\320\262\321\226\320\264\321\205\320\270\320\273\320\265\320\275\320\276/index.html" deleted file mode 100644 index 406c6e74e2..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/promise/\320\262\321\226\320\264\321\205\320\270\320\273\320\265\320\275\320\276/index.html" +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Promise.reject() -slug: Web/JavaScript/Reference/Global_Objects/Promise/відхилено -tags: - - ECMAScript 2015 - - JavaScript - - Promise - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Promise/reject ---- -
{{JSRef}}
- -

Метод Promise.reject() повертає об'єкт Promise, відхилений з наданою причиною.

- -

{{EmbedInteractiveExample("pages/js/promise-reject.html")}}

- - - -

Синтаксис

- -
Promise.reject(reason);
- -

Параметри

- -
-
reason
-
Причина, чому даний проміс був відхилений.
-
- -

Значення, яке повертається

- -

Об'єкт {{jsxref("Promise")}}, відхилений з наданою причиною.

- -

Опис

- -

Статичний метод Promise.reject повертає відхилений об'єкт Promise. З метою відлагодження, а також вибіркового перехоплення помилок зручно використовувати reason як instanceof {{jsxref("Error")}}.

- -

Приклади

- -

Використання статичного методу Promise.reject()

- -
Promise.reject(new Error('fail')).then(function(error) {
-  // не викликається
-}, function(error) {
-  console.error(error); // стек викликів
-});
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-promise.reject', 'Promise.reject')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Promise.reject")}}

- -

Дивіться також

- - diff --git a/files/uk/web/javascript/reference/global_objects/rangeerror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/rangeerror/prototype/index.html deleted file mode 100644 index 8a836ddd56..0000000000 --- a/files/uk/web/javascript/reference/global_objects/rangeerror/prototype/index.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: RangeError.prototype -slug: Web/JavaScript/Reference/Global_Objects/RangeError/prototype -tags: - - Error - - JavaScript - - RangeError - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/RangeError -translation_of_original: Web/JavaScript/Reference/Global_Objects/RangeError/prototype ---- -
{{JSRef}}
- -

Властивість RangeError.prototype є прототипом для конструктора {{jsxref("RangeError")}}

- -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Всі екземпляри {{jsxref("RangeError")}} успадковуються від RangeError.prototype. Ви можете використати прототип, щоб додати властивості чи методи до усіх екземплярів.

- -

Властивості

- -
-
RangeError.prototype.constructor
-
Визначає функцію, яка створила прототип об'єкта.
-
{{jsxref("Error.prototype.message", "RangeError.prototype.message")}}
-
Повідомлення помилки. Хоча ECMA-262 зазначає, що {{jsxref("RangeError")}} має надавати власну властивість message, у SpiderMonkey, він успадковує {{jsxref("Error.prototype.message")}}.
-
{{jsxref("Error.prototype.name", "RangeError.prototype.name")}}
-
Ім'я помилки. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.fileName", "RangeError.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "RangeError.prototype.lineNumber")}}
-
Номер рядка файлу, в якому виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "RangeError.prototype.columnNumber")}}
-
Номер стовпця у рядку, де виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.stack", "RangeError.prototype.stack")}}
-
Трасування стеку. Успаковано від {{jsxref("Error", "Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("RangeError")}} не містить власних методів, екземпляри {{jsxref("RangeError")}} успадковують деякі методи через ланцюжок прототипів.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES3')}}{{Spec2('ES3')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES5.1')}}Визначено як NativeError.prototype.
{{SpecName('ES6', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ES6')}}Визначено як NativeError.prototype.
{{SpecName('ESDraft', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ESDraft')}}Визначено як NativeError.prototype.
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.RangeError")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/referenceerror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/referenceerror/prototype/index.html deleted file mode 100644 index cacfaf2719..0000000000 --- a/files/uk/web/javascript/reference/global_objects/referenceerror/prototype/index.html +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: ReferenceError.prototype -slug: Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype -tags: - - Error - - JavaScript - - ReferenceError - - помилка - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/ReferenceError -translation_of_original: Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype ---- -
{{JSRef}}
- -

Властивість ReferenceError.prototype є прототипом для конструктора {{jsxref("ReferenceError")}}.

- -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Всі екземпляри {{jsxref("ReferenceError")}} успадковуються від ReferenceError.prototype. Ви можете використати прототип, щоб додати властивості чи методи до усіх екземплярів.

- -

Властивості

- -
-
ReferenceError.prototype.constructor
-
Визначає функцію, яка створила прототип об'єкта.
-
{{jsxref("Error.prototype.message", "ReferenceError.prototype.message")}}
-
Повідомлення помилки. Хоча ECMA-262 зазначає, що {{jsxref("ReferenceError")}} повинен мати власну властивість message, у SpiderMonkey він успадковує {{jsxref("Error.prototype.message")}}.
-
{{jsxref("Error.prototype.name", "ReferenceError.prototype.name")}}
-
Ім'я помилки. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.fileName", "ReferenceError.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "ReferenceError.prototype.lineNumber")}}
-
Номер рядка файлу, в якому виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "ReferenceError.prototype.columnNumber")}}
-
Номер стовпця у рядку, де виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.stack", "ReferenceError.prototype.stack")}}
-
Трасування стеку. Успаковано від {{jsxref("Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("ReferenceError")}} не містить власних методів, екземпляри {{jsxref("ReferenceError")}} успадковують деякі методи через ланцюжок прототипів.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES3')}}{{Spec2('ES3')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES5.1')}}Визначено як NativeError.prototype.
{{SpecName('ES6', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ES6')}}Визначено як NativeError.prototype.
{{SpecName('ESDraft', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ESDraft')}}Визначено як NativeError.prototype.
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.ReferenceError")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/syntaxerror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/syntaxerror/prototype/index.html deleted file mode 100644 index b4d42f339c..0000000000 --- a/files/uk/web/javascript/reference/global_objects/syntaxerror/prototype/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: SyntaxError.prototype -slug: Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype -tags: - - Error - - JavaScript - - Prototype - - SyntaxError - - помилка -translation_of: Web/JavaScript/Reference/Global_Objects/SyntaxError -translation_of_original: Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype ---- -
{{JSRef}}
- -

Властивість SyntaxError.prototype є прототипом для конструктора {{jsxref("SyntaxError")}}.

- -

Опис

- -

Всі примірники {{jsxref("SyntaxError")}} успадковуються від SyntaxError.prototype, тож ви можете скористатися прототипом задля додавання властивостей чи методів до всіх примірників.

- -

Властивості

- -
-
SyntaxError.prototype.constructor
-
Функція, що створює прототип об'єкта.
-
{{jsxref("Error.prototype.message", "SyntaxError.prototype.message")}}
-
Повідомлення помилки. Попри те, що в ECMA-262 зазначено, що {{jsxref("SyntaxError")}} мусить мати свою властивість message, у SpiderMonkey він насправді успадковує {{jsxref("Error.prototype.message")}}.
-
{{jsxref("Error.prototype.name", "SyntaxError.prototype.name")}}
-
Ім'я помилки. Успадковано від {{jsxref("Global_Objects/Error", "Error")}}.
-
{{jsxref("Error.prototype.fileName", "SyntaxError.prototype.fileName")}}
-
Шлях до файла, де сталася ця помилка. Успадковано від {{jsxref("Global_Objects/Error", "Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "SyntaxError.prototype.lineNumber")}}
-
Номер рядка у файлі, де сталася ця помилка. Успадковано від {{jsxref("Global_Objects/Error", "Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "SyntaxError.prototype.columnNumber")}}
-
Номер символа у рядку, де сталася ця помилка. Успадковано від {{jsxref("Global_Objects/Error", "Error")}}.
-
{{jsxref("Error.prototype.stack", "SyntaxError.prototype.stack")}}
-
Стек викликів. Успадковано від {{jsxref("Global_Objects/Error", "Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("SyntaxError")}} не містить власних методів, примірники {{jsxref("SyntaxError")}} успадковують деякі методи від ланцюжка прототипів.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES3')}}{{Spec2('ES3')}}Первинне визначення.
{{SpecName('ES5.1', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES5.1')}}Визначено як NativeError.prototype.
{{SpecName('ES6', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ES6')}}Визначено як NativeError.prototype.
{{SpecName('ESDraft', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ESDraft')}}Визначено як NativeError.prototype.
- -

Підтримка веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.SyntaxError")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/typeerror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/typeerror/prototype/index.html deleted file mode 100644 index 7b9c55fc37..0000000000 --- a/files/uk/web/javascript/reference/global_objects/typeerror/prototype/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: TypeError.prototype -slug: Web/JavaScript/Reference/Global_Objects/TypeError/prototype -tags: - - Error - - JavaScript - - TypeError - - помилка -translation_of: Web/JavaScript/Reference/Global_Objects/TypeError -translation_of_original: Web/JavaScript/Reference/Global_Objects/TypeError/prototype ---- -
{{JSRef}}
- -

Властивість TypeError.prototype є прототипом для конструктора {{jsxref("TypeError")}}.

- -

Опис

- -

Всі екземпляри {{jsxref("TypeError")}} успадковуються від TypeError.prototype. Ви можете використати прототип, щоб додати властивості чи методи до усіх екземплярів.

- -

Властивості

- -
-
TypeError.prototype.constructor
-
Визначає функцію, яка створила прототип об'єкта.
-
{{jsxref("Error.prototype.message", "TypeError.prototype.message")}}
-
Повідомлення помилки. Хоча ECMA-262 зазначає, що {{jsxref("TypeError")}} повинен мати власну властивість message, у SpiderMonkey, він успадковує {{jsxref("Error.prototype.message")}}.
-
{{jsxref("Error.prototype.name", "TypeError.prototype.name")}}
-
Ім'я помилки. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.fileName", "TypeError.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "TypeError.prototype.lineNumber")}}
-
Номер рядка файлу, в якому виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "TypeError.prototype.columnNumber")}}
-
Номер стовпця у рядку, де виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.stack", "TypeError.prototype.stack")}}
-
Трасування стеку. Успаковано від {{jsxref("Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("TypeError")}} не містить власних методів, екземпляри {{jsxref("TypeError")}} успадковують деякі методи через ланцюжок прототипів.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES3', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES3')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES5.1')}}Визначено як  NativeError.prototype.
{{SpecName('ES6', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ES6')}}Визначено як  NativeError.prototype.
{{SpecName('ESDraft', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ESDraft')}} 
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.TypeError")}}

-
- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/global_objects/urierror/prototype/index.html b/files/uk/web/javascript/reference/global_objects/urierror/prototype/index.html deleted file mode 100644 index d8a4144790..0000000000 --- a/files/uk/web/javascript/reference/global_objects/urierror/prototype/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: URIError.prototype -slug: Web/JavaScript/Reference/Global_Objects/URIError/prototype -tags: - - Error - - JavaScript - - URIError - - помилка - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/URIError -translation_of_original: Web/JavaScript/Reference/Global_Objects/URIError/prototype ---- -
{{JSRef}}
- -

Властивість URIError.prototype є прототипом для конструктора {{jsxref("URIError")}}.

- -

Опис

- -

Всі екземпляри {{jsxref("URIError")}} успадковуються від URIError.prototype. Ви можете використати прототип, щоб додати властивості чи методи до усіх екземплярів.

- -

Властивості

- -
-
URIError.prototype.constructor
-
Визначає функцію, яка створила прототип об'єкта.
-
{{jsxref("Error.prototype.message", "URIError.prototype.message")}}
-
Повідомлення помилки. Хоча ECMA-262 зазначає, що {{jsxref("URIError")}} повинен мати власну властивість message, у SpiderMonkey, він успадковує {{jsxref("Error.prototype.message")}}.
-
{{jsxref("Error.prototype.name", "URIError.prototype.name")}}
-
Ім'я помилки. Успадковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.fileName", "URIError.prototype.fileName")}}
-
Шлях до файлу, що спричинив помилку. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.lineNumber", "URIError.prototype.lineNumber")}}
-
Номер рядка файлу, в якому виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.columnNumber", "URIError.prototype.columnNumber")}}
-
Номер стовпця у рядку, де виникла помилка. Успаковано від {{jsxref("Error")}}.
-
{{jsxref("Error.prototype.stack", "URIError.prototype.stack")}}
-
Трасування стеку. Успаковано від {{jsxref("Error")}}.
-
- -

Методи

- -

Хоча прототип {{jsxref("URIError")}} не містить власних методів, екземпляри {{jsxref("URIError")}} успадковують деякі методи через ланцюжок прототипів.

- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES3', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES3')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-15.11.7.6', 'NativeError.prototype')}}{{Spec2('ES5.1')}}Визначено як  NativeError.prototype.
{{SpecName('ES6', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ES6')}}Визначено як  NativeError.prototype.
{{SpecName('ESDraft', '#sec-nativeerror.prototype', 'NativeError.prototype')}}{{Spec2('ESDraft')}}Визначено як  NativeError.prototype.
- -

Сумісність з веб-переглядачами

- -
- - -

{{Compat("javascript.builtins.URIError")}}

-
- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/epsilon/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/epsilon/index.html" deleted file mode 100644 index 18655cd15d..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/epsilon/index.html" +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Number.EPSILON -slug: Web/JavaScript/Reference/Global_Objects/Число/EPSILON -tags: - - ECMAScript 2015 - - JavaScript - - Number - - Властивість - - Поле -translation_of: Web/JavaScript/Reference/Global_Objects/Number/EPSILON ---- -
{{JSRef}}
- -

Властивість Number.EPSILON відображає різницю між 1 та найменшим числом із рухомою крапкою, що більше за 1.

- -

Для доступу до цієї статичної властивості не потрібно створювати об'єкт {{jsxref("Число","Number")}} (використовуйте Number.EPSILON).

- -
{{EmbedInteractiveExample("pages/js/number-epsilon.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Властивість EPSILON має значення, близьке до 2.2204460492503130808472633361816E-16, або ж 2-52.

- -

Поліфіл

- -
if (Number.EPSILON === undefined) {
-    Number.EPSILON = Math.pow(2, -52);
-}
- -

Приклади

- -

Перевірка рівності

- -
x = 0.2;
-y = 0.3;
-z = 0.1;
-equal = (Math.abs(x - y + z) < Number.EPSILON);
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.epsilon', 'Number.EPSILON')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.EPSILON")}}

- -

Дивіться також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/index.html" deleted file mode 100644 index 44ee101d87..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/index.html" +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: Number -slug: Web/JavaScript/Reference/Global_Objects/Число -tags: - - JavaScript - - Number - - Довідка - - Клас -translation_of: Web/JavaScript/Reference/Global_Objects/Number ---- -
{{JSRef}}
- -

Об'єкт Number у JavaScript — це об'єкт-обгортка, що дозволяє працювати з числовими значеннями, такими як 37 чи -9.25.

- -

Конструктор Number містить константи та методи для роботи з числами. Значення інших типів можуть бути перетворені на числа за допомогою функції Number().

- -

Тип Number у JavaScript є 64-бітним значенням подвійної точності формату IEEE 754, як double у Java чи у C#. Це означає, що воно може відображати дробові значення, але існують певні обмеження на те, що воно може зберігати. Тип Number зберігає лише близько 17 десяткових знаків точності; числа підлягають округленню. Найбільше значення, яке може зберігати Number, дорівнює приблизно 1.8×10308. Числа за межами цього значення замінюються на спеціальну числову константу {{jsxref("Infinity")}}.

- -

Числові літерали, такі як 37, у коді JavaScript є числами з рухомою крапкою, а не цілими числами. Не існує окремого цілочисельного типу у звичайному повсякденному використанні. (JavaScript нині має тип {{jsxref("BigInt")}}, але він був створений не того, щоб замінити Number у повсякденному використанні. 37 досі належить до типу Number, а не до BigInt.)

- -

Числа також можна виразити у таких літеральних формах, як 0b1010o130x0A. Дізнайтесь більше щодо лексичної граматики чисел тут.

- -

Опис

- -

При використанні в якості функції, Number(value) перетворює рядок чи інше значення на тип Number. Якщо значення не можна перетворити, повертається {{jsxref("NaN")}}.

- -

Літеральний синтаксис

- -
123    // сто двадцять три
-123.0  // те саме
-123 === 123.0  // true
- -

Синтаксис функції

- -
Number('123')  // вертає число 123
-Number('123') === 123  // true
-
-Number("коник")    // NaN
-Number(undefined)  // NaN
- -

Конструктор

- -
-
Number()
-
Створює нове значення Number.
-
- -

Статичні властивості

- -
-
{{jsxref("Число.EPSILON", "Number.EPSILON")}}
-
Найменша можлива різниця між двома числами.
-
{{jsxref("Число.MAX_SAFE_INTEGER", "Number.MAX_SAFE_INTEGER")}}
-
Найбільше безпечне ціле число у JavaScript (253 - 1).
-
{{jsxref("Число.MAX_VALUE", "Number.MAX_VALUE")}}
-
Найбільше додатне число, доступне для відображення.
-
{{jsxref("Число.MIN_SAFE_INTEGER", "Number.MIN_SAFE_INTEGER")}}
-
Найменше безпечне ціле число у JavaScript (-(253 - 1)).
-
{{jsxref("Число.MIN_VALUE", "Number.MIN_VALUE")}}
-
Найменше додатне число, доступне для відображення, — найближче до нуля (за винятком самого нуля) додатне число.
-
{{jsxref("Число.NaN", "Number.NaN")}}
-
Спеціальне значення "{{glossary("NaN", "не число")}}".
-
{{jsxref("Число.NEGATIVE_INFINITY", "Number.NEGATIVE_INFINITY")}}
-
Спеціальне значення, що відображає від'ємну нескінченність. Повертається при переповненні.
-
{{jsxref("Число.POSITIVE_INFINITY", "Number.POSITIVE_INFINITY")}}
-
Спеціальне значення, що відображає нескінченність. Повертається при переповненні.
-
{{jsxref("Число.prototype", "Number.prototype")}}
-
Дозволяє додавати властивості до об'єкта Number.
-
- -

Статичні методи

- -
-
{{jsxref("Число.isNaN()", "Number.isNaN()")}}
-
Визначає, чи є передане значення NaN.
-
{{jsxref("Число.isFinite()", "Number.isFinite()")}}
-
Визначає, чи є передане значення скінченним числом.
-
{{jsxref("Число.isInteger()", "Number.isInteger()")}}
-
Визначає, чи є передане значення цілим числом.
-
{{jsxref("Число.isSafeInteger()", "Number.isSafeInteger()")}}
-
Визначає, чи є передане значення безпечним цілим числом (число між -(253 - 1) та 253 - 1).
-
{{jsxref("Число.parseFloat()", "Number.parseFloat()")}}
-
Те саме, що й глобальна функція {{jsxref("parseFloat", "parseFloat()")}}.
-
{{jsxref("Число.parseInt()", "Number.parseInt()")}}
-
Те саме, що й глобальна функція {{jsxref("parseInt", "parseInt()")}}.
-
- -

Методи екземплярів

- -
-
{{jsxref("Число.prototype.toExponential()", "Number.prototype.toExponential(дробовіЦифри)")}}
-
Повертає рядок, що містить експоненціальний запис числа.
-
{{jsxref("Число.prototype.toFixed()", "Number.prototype.toFixed(цифри)")}}
-
Повертає рядок, що містить запис числа у форматі з нерухомою крапкою.
-
{{jsxref("Число.prototype.toLocaleString()", "Number.prototype.toLocaleString([мови [, параметри]])")}}
-
Повертає рядок, що містить узалежнений від мови запис числа. Заміщує метод {{jsxref("Object.prototype.toLocaleString()")}}.
-
{{jsxref("Число.prototype.toPrecision()", "Number.prototype.toPrecision(точність)")}}
-
Повертає рядок, що містить запис числа із зазначеною точністю у форматі з нерухомою крапкою або у експоненціальному форматі.
-
{{jsxref("Число.prototype.toString()", "Number.prototype.toString([основа])")}}
-
Повертає рядкове представлення наданого об'єкта у вказаній системі числення. Заміщує метод {{jsxref("Object.prototype.toString()")}}.
-
{{jsxref("Число.prototype.valueOf()", "Number.prototype.valueOf()")}}
-
Повертає просте числове значення об'єкта. Заміщує метод {{jsxref("Object.prototype.valueOf()")}}.
-
- -
- -

Приклади

- -

Використання об'єкта Number для присвоєння змінним числових значень

- -

Наведений приклад використовує властивості об'єкта Number, щоб присвоїти кільком змінним числові значення:

- -
const biggestNum     = Number.MAX_VALUE
-const smallestNum    = Number.MIN_VALUE
-const infiniteNum    = Number.POSITIVE_INFINITY
-const negInfiniteNum = Number.NEGATIVE_INFINITY
-const notANum        = Number.NaN
-
- -

Діапазон цілих чисел для Number

- -

У наступному прикладі наведено мінімальне та максимальне цілочисельне значення, які можуть бути відображені об'єктом Number (за детальною інформацією звертайтесь до стандарту ECMAScript, розділ 6.1.6 Тип Number):

- -
const biggestInt = Number.MAX_SAFE_INTEGER   //  (253 - 1) =>  9007199254740991
-const smallestInt = Number.MIN_SAFE_INTEGER  // -(253 - 1) => -9007199254740991
- -

При розборі даних, поданих у форматі JSON, цілі числа, що виходять за межі цього діапазону, можуть виявитися пошкодженими, коли аналізатор JSON примусово перетворює їх у тип Number.

- -

Цьому можна запобігти використанням ({{jsxref("String","рядків")}}).

- -

Більші числа можуть бути відображені за допомогою типу {{jsxref("BigInt")}}.

- -

Використання Number для перетворення об'єкта Date

- -

У наведеному прикладі об'єкт класу {{jsxref ("Date")}} перетворюється на числове значення за допомогою функції Number:

- -
let d = new Date('December 17, 1995 03:24:00')
-console.log(Number(d))
-
- -

Це виведе 819199440000.

- -

Перетворення числових рядків та null на числа

- -
Number('123')     // 123
-Number('123') === 123 /// true
-Number('12.3')    // 12.3
-Number('12.00')   // 12
-Number('123e-1')  // 12.3
-Number('')        // 0
-Number(null)      // 0
-Number('0x11')    // 17
-Number('0b11')    // 3
-Number('0o11')    // 9
-Number('foo')     // NaN
-Number('100a')    // NaN
-Number('-Infinity') //-Infinity
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number-objects', 'Number')}}
- -

Підтримка веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.Number")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isfinite/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isfinite/index.html" deleted file mode 100644 index 8379f3d5c3..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isfinite/index.html" +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Number.isFinite() -slug: Web/JavaScript/Reference/Global_Objects/Число/isFinite -tags: - - JavaScript - - Number - - Довідка - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Number/isFinite ---- -
{{JSRef}}
- -

Метод Number.isFinite() визначає, чи є передане значення скінченним числом.

- -
{{EmbedInteractiveExample("pages/js/number-isfinite.html")}}
- - - -

Синтаксис

- -
Number.isFinite(value)
- -

Параметри

- -
-
value
-
Значення, яке треба перевірити на скінченність.
-
- -

Значення, що повертається

- -

Значення {{jsxref("Boolean")}}, що вказує, чи є надане значення скінченним числом.

- -

Опис

- -

У порівнянні з глобальною функцією {{jsxref("isFinite", "isFinite()")}}, цей метод не перетворює примусово значення параметра на число. Це означає, що тільки значення числового типу, які є скінченними, повернуть true.

- -

Поліфіл

- -
if (Number.isFinite === undefined) Number.isFinite = function(value) {
-    return typeof value === 'number' && isFinite(value);
-}
-
- -

Приклади

- -

Використання isFinite

- -
Number.isFinite(Infinity);  // false
-Number.isFinite(NaN);       // false
-Number.isFinite(-Infinity); // false
-
-Number.isFinite(0);         // true
-Number.isFinite(2e64);      // true
-
-Number.isFinite('0');       // false, дорівнювало б true з
-                            // глобальною функцією isFinite('0')
-Number.isFinite(null);      // false, дорівнювало б true з
-                            // глобальною функцією isFinite(null)
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.isfinite', 'Number.isInteger')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.isFinite")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isinteger/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isinteger/index.html" deleted file mode 100644 index 3cd4988a2b..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isinteger/index.html" +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Number.isInteger() -slug: Web/JavaScript/Reference/Global_Objects/Число/isInteger -tags: - - JavaScript - - Number - - Довідка - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Number/isInteger ---- -
{{JSRef}}
- -

Метод Number.isInteger() визначає, чи є передане значення цілим числом.

- -
{{EmbedInteractiveExample("pages/js/number-isinteger.html")}}
- - - -

Синтаксис

- -
Number.isInteger(value)
- -

Параметри

- -
-
value
-
Значення для перевірки.
-
- -

Повертає

- -

Значення типу {{jsxref("Boolean")}}, що вказує, чи є надане значення цілим числом.

- -

Опис

- -

Якщо параметр є цілим числом, повертає true, інакше вертає false. Якщо значення дорівнює {{jsxref("NaN")}} або {{jsxref("Infinity")}}, повертає false. Цей метод також повертає true для чисел з плаваючою крапкою, які можуть бути представлені як цілі.

- -

Поліфіл

- -
Number.isInteger = Number.isInteger || function(value) {
-  return typeof value === 'number' &&
-    isFinite(value) &&
-    Math.floor(value) === value;
-};
- -

Приклади

- -

Використання isInteger

- -
Number.isInteger(0);         // true
-Number.isInteger(1);         // true
-Number.isInteger(-100000);   // true
-Number.isInteger(99999999999999999999999); // true
-
-Number.isInteger(0.1);       // false
-Number.isInteger(Math.PI);   // false
-
-Number.isInteger(NaN);       // false
-Number.isInteger(Infinity);  // false
-Number.isInteger(-Infinity); // false
-Number.isInteger('10');      // false
-Number.isInteger(true);      // false
-Number.isInteger(false);     // false
-Number.isInteger([1]);       // false
-
-Number.isInteger(5.0);       // true
-Number.isInteger(5.000000000000001); // false
-Number.isInteger(5.0000000000000001); // true
-
- -

Специфікації

- - - - - - - - - - -
Specification
{{SpecName('ESDraft', '#sec-number.isinteger', 'Number.isInteger')}}
- -

Підтримка веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.isInteger")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isnan/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isnan/index.html" deleted file mode 100644 index c9c38ad05d..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/isnan/index.html" +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Number.isNaN() -slug: Web/JavaScript/Reference/Global_Objects/Число/isNaN -tags: - - ECMAScript 2015 - - JavaScript - - Number - - isNaN - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Number/isNaN ---- -
{{JSRef}}
- -

Метод Number.isNaN() визначає, чи є передане значення {{jsxref("NaN")}}, а його типом - {{jsxref("Число", "Number")}}. Це більш надійна версія оригіналу, глобального методу {{jsxref("isNaN", "isNaN()")}}.

- -
{{EmbedInteractiveExample("pages/js/number-isnan.html", "taller")}}
- - - -

Синтаксис

- -
Number.isNaN(value)
- -

Параметри

- -
-
value
-
Значення, що перевірятиметься на {{jsxref("NaN")}}.
-
- -

Значення, що повертається

- -

true, якщо надане значення є {{jsxref("NaN")}}, а його типом - {{jsxref("Число", "Number")}}; інакше, false.

- -

Опис

- -

Через те, що обидва оператори рівності, {{jsxref("Operators/Equality", "==")}} та {{jsxref("Operators/Strict_equality", "===")}}, повертають false при перевірці, чи {{jsxref("NaN")}} дорівнює {{jsxref("NaN")}}, виникла необхідність у функції Number.isNaN(). Ця ситуація відрізняється від усіх інших можливих порівнянь у JavaScript.

- -

У порівнянні з глобальною функцією {{jsxref("isNaN", "isNaN()")}}, Number.isNaN() не має проблеми з примусовим приведенням параметра до числа. Це означає, що тепер стало безпечно передавати значення, які були б перетворені на {{jsxref("NaN")}}, але, насправді, не є значеннями {{jsxref("NaN")}}. Це також означає, що лише значення числового типу, які також є {{jsxref("NaN")}}, вертають true.

- -

Поліфіл

- -

Наступний код працює, тому що NaN є єдиним значенням у JavaScript, яке не дорівнює самому собі.

- -
Number.isNaN = Number.isNaN || function isNaN(input) {
-    return typeof input === 'number' && input !== input;
-}
-
- -

Приклади

- -

Використання isNaN

- -
Number.isNaN(NaN);        // true
-Number.isNaN(Number.NaN); // true
-Number.isNaN(0 / 0);      // true
-
-// наприклад, це дорівнювало б true у глобальному методі isNaN()
-Number.isNaN('NaN');      // false
-Number.isNaN(undefined);  // false
-Number.isNaN({});         // false
-Number.isNaN('ляля');     // false
-
-// Це все вертає false
-Number.isNaN(true);
-Number.isNaN(null);
-Number.isNaN(37);
-Number.isNaN('37');
-Number.isNaN('37.37');
-Number.isNaN('');
-Number.isNaN(' ');
-
- -

Специфікації

- - - - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.isnan', 'Number.isnan')}}
- -

Сумісність з веб-переглядачами

- - - -
{{Compat("javascript.builtins.Number.isNaN")}}
- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/issafeinteger/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/issafeinteger/index.html" deleted file mode 100644 index 8ff3f1fa81..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/issafeinteger/index.html" +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: Number.isSafeInteger() -slug: Web/JavaScript/Reference/Global_Objects/Число/isSafeInteger -tags: - - ECMAScript 2015 - - JavaScript - - Number - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger ---- -
{{JSRef}}
- -

Метод Number.isSafeInteger() визначає, чи є надане значення безпечним цілим числом.

- -
{{EmbedInteractiveExample("pages/js/number-issafeinteger.html")}}
- - - -

Безпечним цілим числом вважається ціле число, яке

- - - -

Наприклад, 253 - 1 є безпечним цілим числом: воно може бути точно відображене, і жодне інше ціле число не округлюється до нього в будь-якому режимі округлення IEEE-754. Для контрасту, 253 не є безпечним цілим числом: воно може бути точно відображене у IEEE-754, але ціле число 253 + 1 не може бути безпосередньо відображене у IEEE-754, а, натомість, округлюється до 253 під час округлення до найближчого цілого та округлення до меншого за модулем. Безпечні цілі числа включають усі цілі числа від -(253 - 1) включно до 253 - 1 включно (± 9007199254740991 або ± 9,007,199,254,740,991).  

- -

Робота зі значеннями, більшими чи меншими за ~9 квадрільйонів, з повною точністю вимагає використання бібліотеки для арифметики довільної точності. Дивіться Що необхідно знати кожному програмісту про арифметику чисел з рухомою крапкою, щоб дізнатись більше щодо відображення чисел з рухомою крапкою.

- -

Для більших чисел розгляньте використання типу {{jsxref("BigInt")}}.

- -

Синтаксис

- -
Number.isSafeInteger(testValue)
-
- -

Параметри

- -
-
testValue
-
Значення, що перевірятиметься на відповідність безпечному цілому числу.
-
- -

Значення, що повертається

- -

Значення {{jsxref("Boolean")}}, яке вказує, чи є надане значення безпечним цілим числом.

- -

Поліфіл

- -
Number.isSafeInteger = Number.isSafeInteger || function (value) {
-   return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
-};
-
- -

Приклади

- -

Використання isSafeInteger

- -
Number.isSafeInteger(3);                    // true
-Number.isSafeInteger(Math.pow(2, 53));      // false
-Number.isSafeInteger(Math.pow(2, 53) - 1);  // true
-Number.isSafeInteger(NaN);                  // false
-Number.isSafeInteger(Infinity);             // false
-Number.isSafeInteger('3');                  // false
-Number.isSafeInteger(3.1);                  // false
-Number.isSafeInteger(3.0);                  // true
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.issafeinteger', 'Number.isSafeInteger')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.isSafeInteger")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_safe_integer/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_safe_integer/index.html" deleted file mode 100644 index c104719e79..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_safe_integer/index.html" +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Number.MAX_SAFE_INTEGER -slug: Web/JavaScript/Reference/Global_Objects/Число/MAX_SAFE_INTEGER -tags: - - ECMAScript 2015 - - JavaScript - - Number - - Властивість - - Поле -translation_of: Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER ---- -
{{JSRef}}
- -

Стала Number.MAX_SAFE_INTEGER відображає найбільше безпечне ціле числове значення у JavaScript (253 - 1).

- -

Для більших цілих значень використовуйте {{jsxref("BigInt")}}.

- -
{{EmbedInteractiveExample("pages/js/number-maxsafeinteger.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Стала MAX_SAFE_INTEGER має значення 9007199254740991 (9,007,199,254,740,991 або ~9 квадриліонів). Причина в тому, що JavaScript використовує формат чисел з рухомою крапкою подвійної точності, як зазначено у IEEE 754, та може безпечно відображати числа лише в діапазоні між -(253 - 1) та 253 - 1.

- -

"Безпечний" в даному контексті означає можливість точно відображати та коректно порівнювати цілі числа. Наприклад,  Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 поверне true, що, з математичної точки зору, неправильно. Дивіться більше на сторінці {{jsxref("Number.isSafeInteger()")}}.

- -

Це поле не існує у старих переглядачах. Його використання без перевірки його наявності, як ось Math.max(Number.MAX_SAFE_INTEGER, 2), видасть небажаний результат, такий як NaN.

- -

У зв'язку з тим, що MAX_SAFE_INTEGER є статичною властивістю {{jsxref("Число","Number")}}, слід завжди викликати її як Number.MAX_SAFE_INTEGER, аніж як метод створеного вами об'єкта {{jsxref("Число","Number")}}.

- -

Поліфіл

- -
if (!Number.MAX_SAFE_INTEGER) {
-    Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
-}
- -

Приклади

- -

Значення, яке вертає MAX_SAFE_INTEGER

- -
Number.MAX_SAFE_INTEGER // 9007199254740991
-
- -

Числа, більші за безпечне ціле значення

- -

Цей код поверне 2, тому що у числах з плаваючою крапкою значенням є кінцева десяткова "1", за винятком випадків денормалізованих чисел, таких як нуль.

- -
Number.MAX_SAFE_INTEGER * Number.EPSILON; // 2
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.max_safe_integer', 'Number.MAX_SAFE_INTEGER')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.MAX_SAFE_INTEGER")}}

- -

Дивіться також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_value/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_value/index.html" deleted file mode 100644 index 3280fa0cd8..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/max_value/index.html" +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Number.MAX_VALUE -slug: Web/JavaScript/Reference/Global_Objects/Число/MAX_VALUE -tags: - - JavaScript - - Number - - Властивість - - Довідка -translation_of: Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE ---- -
{{JSRef}}
- -

Властивість Number.MAX_VALUE відображає максимальне числове значення, доступне для відображення у JavaScript.

- -
{{EmbedInteractiveExample("pages/js/number-maxvalue.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Значення властивості MAX_VALUE приблизно дорівнює 1.79E+308, або 21024. Значення більші за MAX_VALUE, відображаються як {{jsxref("Infinity")}}.

- -

Оскільки MAX_VALUE є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.MAX_VALUE, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}. 

- -

Приклади

- -

Використання MAX_VALUE

- -

Наступний код перемножує два числових значення. Якщо результат менший чи дорівнює MAX_VALUE, викликається функція func1; інакше, викликається функція func2.

- -
if (num1 * num2 <= Number.MAX_VALUE) {
-  func1();
-} else {
-  func2();
-}
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.max_value', 'Number.MAX_VALUE')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.MAX_VALUE")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_safe_integer/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_safe_integer/index.html" deleted file mode 100644 index a8e0553753..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_safe_integer/index.html" +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Number.MIN_SAFE_INTEGER -slug: Web/JavaScript/Reference/Global_Objects/Число/MIN_SAFE_INTEGER -tags: - - ECMAScript 2015 - - JavaScript - - Number - - Властивість -translation_of: Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER ---- -
{{JSRef}}
- -

Константа Number.MIN_SAFE_INTEGER відображає мінімальне безпечне ціле числове значення у JavaScript (-(253 - 1)).

- -

Для відображення менших чисел, використовуйте {{jsxref("BigInt")}}.

- -
{{EmbedInteractiveExample("pages/js/number-min-safe-integer.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Константа MIN_SAFE_INTEGER має значення -9007199254740991 (-9,007,199,254,740,991 або близько -9 квадрильйонів). Причина в тому, що JavaScript використовує формат чисел з рухомою крапкою подвійної точності, як зазначено у IEEE 754, та може безпечно відображати числа лише в діапазоні між -(253 - 1) та 253 - 1.  Дивіться більше інформації у {{jsxref("Number.isSafeInteger()")}}.

- -

Оскільки MIN_SAFE_INTEGER є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.MIN_SAFE_INTEGER, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}.

- -

Приклади

- -

Використання MIN_SAFE_INTEGER

- -
Number.MIN_SAFE_INTEGER // -9007199254740991
--(Math.pow(2, 53) - 1)  // -9007199254740991
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.min_safe_integer', 'Number.MIN_SAFE_INTEGER')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.MIN_SAFE_INTEGER")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_value/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_value/index.html" deleted file mode 100644 index 83ded3444a..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/min_value/index.html" +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Number.MIN_VALUE -slug: Web/JavaScript/Reference/Global_Objects/Число/MIN_VALUE -tags: - - JavaScript - - Number - - Властивість -translation_of: Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE ---- -
{{JSRef}}
- -

Властивість Number.MIN_VALUE відображає найменше числове значення, доступне для відображення у JavaScript.

- -
{{EmbedInteractiveExample("pages/js/number-min-value.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Властивість MIN_VALUE - це число, максимально близьке до 0, а не найменше від'ємне значення, яке може відобразити JavaScript.

- -

MIN_VALUE має значення, що приблизно дорівнює 5e-324. Значення, менші за MIN_VALUE приводяться до 0 ("зникнення порядку").

- -

Оскільки MIN_VALUE є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.MIN_VALUE, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}.

- -

Приклади

- -

Використання MIN_VALUE

- -

Наступний код ділить одне числове значення на інше. Якщо результат більший чи дорівнює MIN_VALUE, викликається функція func1; інакше, викликається функція func2.

- -
if (num1 / num2 >= Number.MIN_VALUE) {
-  func1();
-} else {
-  func2();
-}
-
- -

Специфікації

- - - - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.min_value', 'Number.MIN_VALUE')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.MIN_VALUE")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/nan/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/nan/index.html" deleted file mode 100644 index 10ad96c00a..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/nan/index.html" +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Number.NaN -slug: Web/JavaScript/Reference/Global_Objects/Число/NaN -tags: - - JavaScript - - Number - - Властивість -translation_of: Web/JavaScript/Reference/Global_Objects/Number/NaN ---- -
{{JSRef}}
- -

Властивість Number.NaN відображає "не число" (Not-A-Number). Є еквівалентом {{jsxref("NaN")}}.

- -
{{EmbedInteractiveExample("pages/js/number-nan.html")}}
- -

Вам не потрібно створювати об'єкт {{jsxref("Число", "Number")}}, щоб звертатись до статичної властивості (використовуйте Number.NaN).

- -
{{js_property_attributes(0, 0, 0)}}
- -

Приклади

- -

Перевірка на числове значення

- -
function sanitise(x) {
-  if (isNaN(x)) {
-    return Number.NaN;
-  }
-  return x;
-}
- -

Перевірка на NaN

- -

Дивіться Перевірку на NaN на сторінці NaN.

- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.nan', 'Number.NaN')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.NaN")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/negative_infinity/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/negative_infinity/index.html" deleted file mode 100644 index aeab7dfa10..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/negative_infinity/index.html" +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Number.NEGATIVE_INFINITY -slug: Web/JavaScript/Reference/Global_Objects/Число/NEGATIVE_INFINITY -tags: - - JavaScript - - Number - - Властивість - - Довідка -translation_of: Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY ---- -
{{JSRef}}
- -

Властивість Number.NEGATIVE_INFINITY відображає значення від'ємної нескінченності.

- -
{{EmbedInteractiveExample("pages/js/number-negative-infinity.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Значення Number.NEGATIVE_INFINITY є таким самим, як від'ємне значення властивості {{jsxref("Infinity")}} глобального об'єкта.

- -

Це значення поводиться дещо інакше, ніж математична нескінченність:

- - - -

Ви можете скористатись властивістю Number.NEGATIVE_INFINITY, щоб позначити помилку в умові, яка повертає скінченне число у випадку успіху. Зауважте, однак, що метод {{jsxref("isFinite")}} в цьому випадку був би більш доречним.

- -

Оскільки NEGATIVE_INFINITY є статичною властивістю {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.NEGATIVE_INFINITY, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}. 

- -

Приклади

- -

Використання NEGATIVE_INFINITY

- -

У наступному прикладі змінній smallNumber присвоюється значення, яке є меншим за мінімальне. Коли виконується інструкція {{jsxref("Statements/if...else", "if")}}, smallNumber має значення -Infinity, отже smallNumber присвоюється більш кероване значення для продовження.

- -
var smallNumber = (-Number.MAX_VALUE) * 2;
-
-if (smallNumber === Number.NEGATIVE_INFINITY) {
-  smallNumber = returnFinite();
-}
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.negative_infinity', 'Number.NEGATIVE_INFINITY')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.NEGATIVE_INFINITY")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/number/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/number/index.html" deleted file mode 100644 index c1dd069e56..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/number/index.html" +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Number() constructor -slug: Web/JavaScript/Reference/Global_Objects/Число/Number -tags: - - JavaScript - - Number - - Довідка - - Конструктор -translation_of: Web/JavaScript/Reference/Global_Objects/Number/Number ---- -
{{JSRef}}
- -

Конструктор Number() створює об'єкт {{jsxref("Число", "Number")}}.

- -

Синтаксис

- -
new Number(value)
-
- -

Параметри

- -
-
value
-
Числове значення об'єкта, що створюється.
-
- -

Приклади

- -

Створення об'єктів Number

- -
const a = new Number('123'); // a === 123 дорівнює false
-const b = Number('123');     // b === 123 дорівнює true
-a instanceof Number;         // дорівнює true
-b instanceof Number;         // дорівнює false
- -

Специфікації

- - - - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number-constructor', 'Number constructor')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.Number")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parsefloat/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parsefloat/index.html" deleted file mode 100644 index 81d55dcfc1..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parsefloat/index.html" +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Number.parseFloat() -slug: Web/JavaScript/Reference/Global_Objects/Число/parseFloat -tags: - - ECMAScript 2015 - - JavaScript - - Number - - метод - - число -translation_of: Web/JavaScript/Reference/Global_Objects/Number/parseFloat ---- -
{{JSRef}}
- -

Метод Number.parseFloat() розбирає аргумент та повертає число з плаваючою крапкою. Якщо число неможливо розібрати з аргумента, повертає {{jsxref("NaN")}}.

- -
{{EmbedInteractiveExample("pages/js/number-parsefloat.html")}}
- - - -

Синтаксис

- -
Number.parseFloat(string)
- -

Параметри

- -
-
string
-
Значення, яке треба розібрати. Якщо цей аргумент не є рядком, то він приводиться до рядка за допомогою абстрактної операції ToString. {{glossary("whitespace", "Пробільний символ")}} на початку цього аргументу ігнорується.
-
- -

Значення, що повертається

- -

Число з плаваючою крапкою з наданого рядка string.

- -

Або {{jsxref("NaN")}}, коли перший непробільний символ не може бути перетворений на число.

- -

Поліфіл

- -
if (Number.parseFloat === undefined) {
-  Number.parseFloat = parseFloat;
-}
-
- -

Приклади

- -

Number.parseFloat проти parseFloat

- -

Цей метод має таку саму функціональність, як і глобальна функція {{jsxref("parseFloat", "parseFloat()")}}:

- -
Number.parseFloat === parseFloat; // true
-
- -

Цей метод також є частиною ECMAScript 2015. (Його метою є модуляризація глобальних елементів.)

- -

Дивіться більше подробиць та приклади у {{jsxref("parseFloat", "parseFloat()")}}.

- -

Специфікації

- - - - - - - - - - - - -
Специфікації
{{SpecName('ESDraft', '#sec-number.parsefloat', 'Number.parseFloat')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.parseFloat")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parseint/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parseint/index.html" deleted file mode 100644 index 8bb6c28c80..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/parseint/index.html" +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Number.parseInt() -slug: Web/JavaScript/Reference/Global_Objects/Число/parseInt -tags: - - ECMAScript 2015 - - JavaScript - - Number - - метод -translation_of: Web/JavaScript/Reference/Global_Objects/Number/parseInt ---- -
{{JSRef}}
- -

Метод Number.parseInt() розбирає рядковий аргумент та повертає ціле число з вказаною основою системи числення.

- -
{{EmbedInteractiveExample("pages/js/number-parseint.html", "taller")}}
- - - -

Синтаксис

- -
Number.parseInt(string,[ radix])
- -

Параметри

- -
-
-
string
-
Значення, яке розбиратиметься. Якщо цей аргумент не є рядком, то він приводиться до рядка за допомогою абстрактної операції ToString. Пробільний символ на початку цього аргументу ігнорується.
-
radix {{optional_inline}}
-
Ціле число між 2 та 36, яке вказує основу (в математичних системах числення) значення string. Будьте обережні — вона не дорівнює за замовчуванням 10!
-
-
- -

Значення, що повертається

- -

Ціле число, отримане з наданого рядка string.

- -

Якщо значення radix менше за 2 чи більше за 36, а перший непробільний символ не може бути перетворений на число, повертається {{jsxref("NaN")}}.

- -

Поліфіл

- -
if (Number.parseInt === undefined) {
-    Number.parseInt = window.parseInt
-}
-
- -

Приклади

- -

Number.parseInt проти parseInt

- -

Цей метод має таку саму функціональність, як і глобальна функція {{jsxref("parseInt", "parseInt()")}}:

- -
Number.parseInt === parseInt // true
- -

і є частиною ECMAScript 2015 (його метою є модуляризація глобальних елементів). Будь ласка, дивіться більше подробиць та прикладів у {{jsxref("parseInt", "parseInt()")}}.

- -

Специфікації

- - - - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.parseint', 'Number.parseInt')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.parseInt")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/positive_infinity/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/positive_infinity/index.html" deleted file mode 100644 index 5c22467fb7..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/positive_infinity/index.html" +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Number.POSITIVE_INFINITY -slug: Web/JavaScript/Reference/Global_Objects/Число/POSITIVE_INFINITY -tags: - - JavaScript - - Number - - Властивість - - Довідка -translation_of: Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY ---- -
{{JSRef}}
- -

Властивість Number.POSITIVE_INFINITY відображає значення позитивної нескінченності.

- -
{{EmbedInteractiveExample("pages/js/number-positive-infinity.html")}}
- - - -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Значення Number.POSITIVE_INFINITY є таким самим, як і значення властивості глобального об'єкта {{jsxref("Infinity")}}.

- -

Це значення поводиться дещо інакше, ніж математична нескінченність:

- - - -

Ви можете скористатись властивістю Number.POSITIVE_INFINITY, щоб позначити помилку в умові, яка вертає скінченне число у випадку успіху. Зауважте, однак, що метод {{jsxref("isFinite")}} в цьому випадку більш доречний.

- -

Оскільки POSITIVE_INFINITY є статичною властивістю об'єкта {{jsxref("Число", "Number")}}, її завжди слід використовувати як Number.POSITIVE_INFINITY, а не як властивість створеного вами об'єкта {{jsxref("Число", "Number")}}. 

- -

Приклади

- -

Використання POSITIVE_INFINITY

- -

У наступному прикладі змінній bigNumber присвоюється значення, яке є більшим за максимальне. Коли виконується інструкція {{jsxref("Statements/if...else", "if")}}, bigNumber має значення Infinity, а отже, bigNumber присвоюється більш кероване значення для продовження.

- -
var bigNumber = Number.MAX_VALUE * 2;
-
-if (bigNumber == Number.POSITIVE_INFINITY) {
-  bigNumber = returnFinite();
-}
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.positive_infinity', 'Number.POSITIVE_INFINITY')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.POSITIVE_INFINITY")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/prototype/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/prototype/index.html" deleted file mode 100644 index 3cd9d811cc..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/prototype/index.html" +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Number.prototype -slug: Web/JavaScript/Reference/Global_Objects/Число/prototype -tags: - - JavaScript - - Number - - Property - - Prototype -translation_of: Web/JavaScript/Reference/Global_Objects/Number -translation_of_original: Web/JavaScript/Reference/Global_Objects/Number/prototype ---- -
{{JSRef}}
- -

Властивість Number.prototype являє собою прототип для конструктора класу {{jsxref("Global_Objects/Number", "Number")}}.

- -
{{js_property_attributes(0, 0, 0)}}
- -

Опис

- -

Кожен примірник класу {{jsxref("Global_Objects/Number", "Number")}} успадковує властивості й методи з Number.prototype. Зміни, внесені до прототипа, позначаться на всіх об'єктах, що є примірниками класу {{jsxref("Global_Objects/Number", "Number")}}.

- -

Властивості

- -
-
Number.prototype.constructor
-
Повертає функцію, що створила цей примірник об'єкта. Типово це об'єкт {{jsxref("Global_Objects/Number", "Number")}}, який водночас є і функцією.
-
- -

Методи

- -
-
{{jsxref("Number.prototype.toExponential()")}}
-
Повертає рядок, що містить експоненціальний запис числа.
-
{{jsxref("Number.prototype.toFixed()")}}
-
Повертає рядок, що містить запис числа у форматі з нерухомою комою.
-
{{jsxref("Number.prototype.toLocaleString()")}}
-
Повертає рядок, що містить узалежнений від мови запис числа. Перекриває метод {{jsxref("Object.prototype.toLocaleString()")}}.
-
{{jsxref("Number.prototype.toPrecision()")}}
-
Повертає рядок, що містить запис числа із зазначеною точністю у форматі з нерухомою комою чи експоненціальний.
-
{{jsxref("Number.prototype.toSource()")}} {{non-standard_inline}}
-
Повертає рядок, що містить код мовою JavaScript, який створює об'єкт класу {{jsxref("Global_Objects/Number", "Number")}} з відповідним значенням. Цей код можна використати для створення нового об'єкта. Перекриває метод {{jsxref("Object.prototype.toSource()")}}.
-
{{jsxref("Number.prototype.toString()")}}
-
Повертає рядок, що містить числовий запис значення об'єкта в зазначеній системі числення. Перекриває метод {{jsxref("Object.prototype.toString()")}}.
-
{{jsxref("Number.prototype.valueOf()")}}
-
Повертає {{Glossary("Primitive", "просте числове значення")}} об'єкта. Перекриває метод {{jsxref("Object.prototype.valueOf()")}}.
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Первинне визначення. Реалізовано у JavaScript 1.1.
{{SpecName('ES5.1', '#sec-15.7.4', 'Number')}}{{Spec2('ES5.1')}} 
{{SpecName('ES6', '#sec-properties-of-the-number-prototype-object', 'Number')}}{{Spec2('ES6')}} 
{{SpecName('ESDraft', '#sec-properties-of-the-number-prototype-object', 'Number')}}{{Spec2('ESDraft')}} 
- -

Підтримка веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.prototype")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toexponential/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toexponential/index.html" deleted file mode 100644 index 9896ee2c95..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toexponential/index.html" +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Number.prototype.toExponential() -slug: Web/JavaScript/Reference/Global_Objects/Число/toExponential -tags: - - JavaScript - - Number - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/toExponential ---- -
{{JSRef}}
- -

Метод toExponential() повертає рядок, що відображає об'єкт Number в експоненціальному позначенні.

- -
{{EmbedInteractiveExample("pages/js/number-toexponential.html")}}
- - - -

Синтаксис

- -
numObj.toExponential([fractionDigits])
- -

Параметри

- -
-
fractionDigits
-
Необов'язковий параметр. Ціле число, яке визначає кількість цифр після десяткової крапки. За замовчуванням використовується стільки цифр, скільки необхідно для відображення числа.
-
- -

Значення, що повертається

- -

Рядок, що відображає об'єкт {{jsxref("Число", "Number")}} в експоненційному позначенні, з однією цифрою перед десятковою крапкою, округлене до fractionDigits цифр після крапки. 

- -

Винятки

- -
-
{{jsxref("RangeError")}}
-
Якщо значення fractionDigits занадто маленьке або занадто велике. Значення між 0 і 20, включно, не спричинять {{jsxref("RangeError")}}. Також реалізації можуть підтримувати більші та менші значення.
-
{{jsxref("TypeError")}}
-
Якщо цей метод викликається на об'єкті, який не є об'єктом {{jsxref("Число", "Number")}}.
-
- -

Опис

- -

Якщо аргумент fractionDigits не вказаний, кількість цифр після десяткової крапки за замовчуванням дорівнює кількості цифр, необхідній для унікального відображення значення.

- -

Якщо ви використовуєте метод toExponential() на числовому літералі, і цей літерал не має експоненціального показника та десяткової крапки, залиште пробіл(и) перед крапкою, що передує виклику методу, щоб запобігти її інтерпретації як десяткової крапки.

- -

Якщо число має більше цифр, ніж вимагає параметр fractionDigits, число округлюється до найближчого числа, представленого цифрами fractionDigits. Дивіться приклад округлення в описі методу {{jsxref("Number.prototype.toFixed", "toFixed()")}}, який також застосовується у toExponential().

- -

Приклади

- -

Використання toExponential

- -
var numObj = 77.1234;
-
-console.log(numObj.toExponential());  // виводить 7.71234e+1
-console.log(numObj.toExponential(4)); // виводить 7.7123e+1
-console.log(numObj.toExponential(2)); // виводить 7.71e+1
-console.log(77.1234.toExponential()); // виводить 7.71234e+1
-console.log(77 .toExponential());     // виводить 7.7e+1
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.toexponential', 'Number.prototype.toExponential')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.toExponential")}}

- -

Дивіться також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tofixed/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tofixed/index.html" deleted file mode 100644 index a36e157a44..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tofixed/index.html" +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: Number.prototype.toFixed() -slug: Web/JavaScript/Reference/Global_Objects/Число/toFixed -tags: - - JavaScript - - Number - - Довідка - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/toFixed ---- -
{{JSRef}}
- -

Метод toFixed() форматує число, використовуючи позначення з нерухомою крапкою.

- -
{{EmbedInteractiveExample("pages/js/number-tofixed.html")}}
- - - -

Синтаксис

- -
numObj.toFixed([digits])
- -

Параметри

- -
-
digits {{optional_inline}}
-
Кількість цифр після десяткової крапки; це має бути значення між 0 та 20, включно, а реалізації можуть за бажанням підтримувати ширший діапазон значень. Якщо цей аргумент пропущений, він вважається рівним 0.
-
- -

Значення, що повертається

- -

Рядок, що відображає надане число у форматі числа з нерухомою крапкою.

- -

Винятки

- -
-
{{jsxref("RangeError")}}
-
Якщо значення digits надто маленьке чи надто велике. Значення між 0 та 100, включно, не спричинять {{jsxref("RangeError")}}. Реалізаціям дозвонено підтримувати більші та менші значення, за вибором.
-
{{jsxref("TypeError")}}
-
Якщо цей метод вкликається на об'єкті, який не є об'єктом {{jsxref("Число", "Number")}}.
-
- -

Опис

- -

toFixed() вертає рядкове представлення об'єкта numObj, яке не використовує експоненціальне позначення і має рівно digits цифр після десяткової позиції. Число округлюється за необхідності, а дробова частина заповнюється нулями, якщо це необхідно для досягнення необхідної довжини. Якщо абсолютне значення numObj більше або дорівнює 1e+21, цей метод просто викликає {{jsxref("Number.prototype.toString()")}} та повертає рядок у експоненціальному позначенні.

- -
-

Застереження: Числа з рухомою крапкою не здатні точно відображати усі десяткові числа у двійковому представленні. Це може призвести до неочікуваних результатів, наприклад 0.1 + 0.2 === 0.3, що вертає false .

-
- -

Приклади

- -

Використання toFixed

- -
let numObj = 12345.6789
-
-numObj.toFixed()       // Вертає '12346': зверніть увагу на округлення, немає дробової частини
-numObj.toFixed(1)      // Вертає '12345.7': зверніть увагу на округлення
-numObj.toFixed(6)      // Вертає '12345.678900': зверніть увагу на додані нулі
-(1.23e+20).toFixed(2)  // Вертає '123000000000000000000.00'
-(1.23e-10).toFixed(2)  // Вертає '0.00'
-2.34.toFixed(1)        // Вертає '2.3'
-2.35.toFixed(1)        // Вертає '2.4'. Зауважте, округлюється вгору
-2.55.toFixed(1)        // Вертає '2.5'. Зауважте, округлюється вниз - дивіться застереження вище
--2.34.toFixed(1)       // Вертає -2.3 (через пріоритет операторів, від'ємні числові літерали не повертають рядок...)
-(-2.34).toFixed(1)     // Вертає '-2.3'
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.tofixed', 'Number.prototype.toFixed')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.toFixed")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tolocalestring/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tolocalestring/index.html" deleted file mode 100644 index a65659d7de..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tolocalestring/index.html" +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Number.prototype.toLocaleString() -slug: Web/JavaScript/Reference/Global_Objects/Число/toLocaleString -tags: - - JavaScript - - Number - - Інтернаціоналізація - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/toLocaleString ---- -
{{JSRef}}
- -

Метод toLocaleString() повертає рядок, що відображає число у відповідності до налаштувань мови.

- -
{{EmbedInteractiveExample("pages/js/number-tolocalestring.html")}}
- - - -

Синтаксис

- -
numObj.toLocaleString([locales [, options]])
- -

Параметри

- -

Аргументи locales та options налаштовують поведінку функції та дозволяють застосункам вказувати мову, чиї правила форматування мають застосовуватись. У тих реалізаціях, які ігнорують аргументи locales та options, локальні налаштування та форма поверненого рядка повністю залежать від реалізації.

- -
Дивіться конструктор Intl.NumberFormat(), щоб дізнатись подробиці щодо цих параметрів та їхнього використання.
- -

Значення, що повертається

- -

Рядок, що відображає число у відповідності до налаштувань мови.

- -

Швидкодія

- -

При форматуванні великої кількості чисел краще створити об'єкт {{jsxref("NumberFormat")}} та використовувати функцію, надану його властивістю {{jsxref("NumberFormat.format")}}.

- -

Приклади

- -

Використання toLocaleString

- -

При загальному використанні, без зазначення локалі, повертається рядок у мовному форматі, що стоїть за замовчуванням та з початковими параметрами.

- -
var number = 3500;
-
-console.log(number.toLocaleString()); // Відображає "3,500" у форматі U.S. English
-
- -

Перевірка підтримки аргументів locales та options

- -

Аргументи locales та options ще не підтримуються в усіх переглядачах. Для перевірки їхньої підтримки у ES5.1 та новіших реалізаціях можна скористатись вимогою, згідно якої недозволені мовні позначення відхиляються з винятком {{jsxref("Global_Objects/RangeError", "RangeError")}}:

- -
function toLocaleStringSupportsLocales() {
-  var number = 0;
-  try {
-    number.toLocaleString('i');
-  } catch (e) {
-    return e.name === 'RangeError';
-  }
-  return false;
-}
-
- -

До ES5.1, реалізації не були зобов'язані викидати виняток з помилкою діапазону, якщо toLocaleString викликався з аргументами.

- -

Перевірка, яка працює в усіх хостах, в тому числі тих, що підтримують ECMA-262 до версії 5.1, полягає в безпосередньому тестуванні функцій, визначених у ECMA-402 як такі, що зобов'язані підтримувати регіональні налаштування для Number.prototype.toLocaleString:

- -
function toLocaleStringSupportsOptions() {
-  return !!(typeof Intl == 'object' && Intl && typeof Intl.NumberFormat == 'function');
-}
-
- -

Цей код перевіряє наявність глобального об'єкта Intl, перевіряє, що він не дорівнює null та що він має властивість NumberFormat, яка є функцією.

- -

Використання locales

- -

Цей приклад демонструє деякі варіації локалізованих форматів чисел. Щоб отримати формат мови, задіяної в інтерфейсі вашого застосутку, переконайтесь, що вказали цю мову (та, можливо, кілька запасних мов) за допомогою аргументу locales:

- -
var number = 123456.789;
-
-// В німецькій десятковим роздільником є кома, а крапка розділяє тисячі
-console.log(number.toLocaleString('de-DE'));
-// → 123.456,789
-
-// Арабська у більшості арабськомовних країн використовує Індо-арабські цифри
-console.log(number.toLocaleString('ar-EG'));
-// → ١٢٣٤٥٦٫٧٨٩
-
-// Індія використовує роздільники тисячі/лакх/крор
-console.log(number.toLocaleString('en-IN'));
-// → 1,23,456.789
-
-// ключ розширення nu налаштовує систему нумерації, наприклад, китайську десяткову
-console.log(number.toLocaleString('zh-Hans-CN-u-nu-hanidec'));
-// → 一二三,四五六.七八九
-
-// при запиті мови, яка, можливо, не підтримується, наприклад,
-// балійської, додайте запасні мови, в даному випадку це індонезійська
-console.log(number.toLocaleString(['ban', 'id']));
-// → 123.456,789
- -

Використання options

- -

Результат методу toLocaleString можна налаштувати за допомогою аргументу options:

- -
var number = 123456.789;
-
-// налаштування формату валюти
-console.log(number.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' }));
-// → 123.456,79 €
-
-// японська єна не використовує дробові розряди
-console.log(number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }))
-// → ¥123,457
-
-// обмежити трьома значущими цифрами
-console.log(number.toLocaleString('en-IN', { maximumSignificantDigits: 3 }));
-// → 1,23,000
-
-// Використовувати мову системи з параметрами для форматування чисел
-var num = 30000.65;
-console.log(num.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
-// → "30,000.65" де мова системи англійська, або
-// → "30.000,65" де мова системи німецька, або
-// → "30 000,65" де мова системи французька
-
- -

Специфікації

- - - - - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.tolocalestring', 'Number.prototype.toLocaleString')}}
{{SpecName('ES Int Draft', '#sup-number.prototype.tolocalestring', 'Number.prototype.toLocaleString')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.toLocaleString")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toprecision/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toprecision/index.html" deleted file mode 100644 index 3c0ecefc4a..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/toprecision/index.html" +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Number.prototype.toPrecision() -slug: Web/JavaScript/Reference/Global_Objects/Число/toPrecision -tags: - - JavaScript - - Number - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/toPrecision ---- -
{{JSRef}}
- -

Метод toPrecision() вертає рядкове відображення об'єкта {{jsxref("Число", "Number")}} з вказаною точністю.

- -
{{EmbedInteractiveExample("pages/js/number-toprecision.html")}}
- -

Синтаксис

- -
numObj.toPrecision([precision])
- -

Параметри

- -
-
precision {{optional_inline}}
-
Ціле число, що вказує кількість значущих цифр.
-
- -

Значення, що повертається

- -

Рядок, що відображає об'єкт {{jsxref("Число", "Number")}} у форматі з нерухомою крапкою або експоненціальному форматі, округлений до кількості значущих цифр precision. Дивіться обговорення округлення у описі методу {{jsxref("Number.prototype.toFixed()")}}, яке також застосовується в методі toPrecision().

- -

Якщо аргумент precision не вказаний, метод поводиться як {{jsxref("Number.prototype.toString()")}}. Якщо аргумент precision не є цілочисельним значенням, воно округлюється до найближчого цілого числа.

- -

Винятки

- -
-
{{jsxref("Global_Objects/RangeError", "RangeError")}}
-
Якщо значення precision не знаходиться в діапазоні між 1 та 100 (включно), викидається {{jsxref("RangeError")}}. Реалізаціям дозволено підтримувати також більші та менші значення. ECMA-262 лише вимагає точності до 21 значущої цифри.
-
- -

Приклади

- -

Використання toPrecision

- -
let numObj = 5.123456
-
-console.log(numObj.toPrecision())    // виводить '5.123456'
-console.log(numObj.toPrecision(5))   // виводить '5.1235'
-console.log(numObj.toPrecision(2))   // виводить '5.1'
-console.log(numObj.toPrecision(1))   // виводить '5'
-
-numObj = 0.000123
-
-console.log(numObj.toPrecision())    // виводить '0.000123'
-console.log(numObj.toPrecision(5))   // виводить '0.00012300'
-console.log(numObj.toPrecision(2))   // виводить '0.00012'
-console.log(numObj.toPrecision(1))   // виводить '0.0001'
-
-// зауважте, що в деяких обставинах може повернутись експоненціальний запис
-console.log((1234.5).toPrecision(2)) // виводить '1.2e+3'
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.toprecision', 'Number.prototype.toPrecision')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.toPrecision")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tosource/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tosource/index.html" deleted file mode 100644 index 55a86a9972..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tosource/index.html" +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Number.prototype.toSource() -slug: Web/JavaScript/Reference/Global_Objects/Число/toSource -tags: - - JavaScript - - Number - - застарілий - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/toSource ---- -
{{JSRef}} {{obsolete_header}}
- -

Метод toSource() вертає рядкове представлення першокоду об'єкта.

- -

Синтаксис

- -
numObj.toSource()
-Number.toSource()
- -

Значення, що вертається

- -

Рядкове представлення першокоду об'єкта.

- -

Приклади

- -

Вбудована функція

- -

Для вбудованого об'єкта {{jsxref("Число", "Number")}}, toSource() вертає наступний рядок, який вказує, що першокод недоступний:

- -
function Number() {
-    [native code]
-}
-
- -

Для екземплярів {{jsxref("Число", "Number")}}, toSource() вертає рядкове представлення першокоду.

- -

Цей метод зазвичай викликається внутрішньо у JavaScript, а не явно у коді.

- -

Специфікації

- -

Не є частиною жодного стандарту.

- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.toSource")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tostring/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tostring/index.html" deleted file mode 100644 index dcd4d82bb0..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/tostring/index.html" +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Number.prototype.toString() -slug: Web/JavaScript/Reference/Global_Objects/Число/toString -tags: - - JavaScript - - Number - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/toString ---- -
{{JSRef}}
- -

Метод toString() вертає рядкове представлення вказаного об'єкта {{jsxref("Число", "Number")}}.

- -
{{EmbedInteractiveExample("pages/js/number-tostring.html")}}
- - - -

Синтаксис

- -
numObj.toString([radix])
- -

Параметри

- -
-
radix
-
Необов'язковий. Ціле число в діапазоні від 2 до 36, яке вказує основу системи числення для відображення чисел.
-
- -

Значення, що вертається

- -

Рядкове представлення вказаного об'єкта {{jsxref("Число", "Number")}}.

- -

Винятки

- -
-
{{jsxref("RangeError")}}
-
Якщо методу toString() надано основу, меншу за 2 чи більшу за 36, викидається {{jsxref("RangeError")}}.
-
- -

Опис

- -

Об'єкт {{jsxref("Число", "Number")}} заміщує метод toString() об'єкта {{jsxref("Object")}}. (Він не успадковує {{jsxref("Object.prototype.toString()")}}). Для об'єктів {{jsxref("Число", "Number")}}, метод toString() вертає рядкове представлення об'єкта у вказаній системі числення.

- -

Метод toString() розбирає перший аргумент та намагається повернути рядкове представлення числа з вказаною основою radix. Для основ, більших за 10, літери алфавіту вказують числа, більші за 9. Наприклад, для шістнадцяткових чисел (основа 16) використовуються літери від a до f.

- -

Якщо аргумент radix не вказаний, основа вважається рівною 10.

- -

Якщо значення numObj від'ємне, знак зберігається. Це відбувається, навіть якщо основа дорівнює 2; повернений рядок - це додатне двійкове представлення числа numObj зі знаком - попереду, а не numObj у форматі доповняльного коду.

- -

Якщо numObj не є цілим числом, знак 'крапка' використовується для відділення десяткових знаків.

- -

Приклади

- -

Використання toString

- -
let count = 10
-
-console.log(count.toString())    // виводить '10'
-console.log((17).toString())     // виводить '17'
-console.log((17.2).toString())   // виводить '17.2'
-
-let x = 6
-
-console.log(x.toString(2))       // виводить '110'
-console.log((254).toString(16))  // виводить 'fe'
-
-console.log((-10).toString(2))   // виводить '-1010'
-console.log((-0xff).toString(2)) // виводить '-11111111'
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.tostring', 'Number.prototype.tostring')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.toString")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/valueof/index.html" "b/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/valueof/index.html" deleted file mode 100644 index 9ec495bfa3..0000000000 --- "a/files/uk/web/javascript/reference/global_objects/\321\207\320\270\321\201\320\273\320\276/valueof/index.html" +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Number.prototype.valueOf() -slug: Web/JavaScript/Reference/Global_Objects/Число/valueOf -tags: - - JavaScript - - Number - - Довідка - - метод - - прототип -translation_of: Web/JavaScript/Reference/Global_Objects/Number/valueOf ---- -
{{JSRef}}
- -

Метод valueOf() вертає загорнуте примітивне значення об'єкта {{jsxref("Число", "Number")}}.

- -
{{EmbedInteractiveExample("pages/js/number-valueof.html")}}
- - - -

Синтаксис

- -
numObj.valueOf()
- -

Значення, що вертається

- -

Число, яке відображає примітивне значення вказаного об'єкта {{jsxref("Число", "Number")}}.

- -

Опис

- -

Цей метод, зазвичай, викликається внутрішньо у JavaScript, а не явно у коді.

- -

Приклади

- -

Використання valueOf

- -
let numObj = new Number(10)
-console.log(typeof numObj)  // object
-
-let num = numObj.valueOf()
-console.log(num)            // 10
-console.log(typeof num)     // number
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-number.prototype.valueof', 'Number.prototype.valueOf')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.builtins.Number.valueOf")}}

- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/iteration_protocols/index.html b/files/uk/web/javascript/reference/iteration_protocols/index.html new file mode 100644 index 0000000000..d5899043ca --- /dev/null +++ b/files/uk/web/javascript/reference/iteration_protocols/index.html @@ -0,0 +1,352 @@ +--- +title: Протоколи перебору +slug: Web/JavaScript/Reference/Протоколи_перебору +tags: + - ECMAScript 2015 + - JavaScript + - Ітератор + - ітерабельний об'єкт +translation_of: Web/JavaScript/Reference/Iteration_protocols +--- +
{{jsSidebar("More")}}
+ +

Пара доповнень до ECMAScript 2015 є не новими вбудованими елементами чи синтаксисом, а протоколами. Ці протоколи можуть реалізовуватись будь-яким об'єктом, що відповідає певним правилам.

+ +

Існують два протоколи: протокол ітерабельного об'єкта і протокол ітератора.

+ +

Протокол ітерабельного об'єкта

+ +

Протокол ітерабельного об'єкта дозволяє об'єктам JavaScript визначати чи налаштовувати свою ітераційну поведінку, наприклад, через які значення буде проходити цикл у конструкції {{jsxref("Statements/for...of", "for..of")}}. Деякі вбудовані типи є вбудованими ітерабельними об'єктами з визначеною за замовчуванням ітераційною поведінкою, наприклад, {{jsxref("Array")}} або {{jsxref("Map")}}, в той час, як інші типи (такі, як {{jsxref("Object")}}) не є ітерабельними.

+ +

Для того, щоб бути ітерабельним, об'єкт має реалізувати метод @@iterator, тобто, цей об'єкт (або один з об'єктів у його ланцюжку прототипів) повинен мати властивість з ключем @@iterator, доступну через константу {{jsxref("Symbol.iterator")}}:

+ + + + + + + + + + + + + + +
ВластивістьЗначення
[Symbol.iterator]Функція без аргументів, яка повертає об'єкт, що відповідає протоколу ітератора.
+ +

Коли виникає необхідність перебрати об'єкт (наприклад, на початку циклу for..of), його метод @@iterator викликається без аргументів, а ітератор, який він повертає, використовується для отримання значень, що перебираються.

+ +

Протокол ітератора

+ +

Протокол ітератора визначає стандартний спосіб створювати послідовності значень (скінченні або нескінченні).

+ +

Об'єкт є ітератором, коли реалізує метод next() з наступною семантикою:

+ + + + + + + + + + + + +
ВластивістьЗначення
next +

Функція з нулем аргументів, яка повертає об'єкт з двома властивостями:

+ +
    +
  • done (булеве значення) + +
      +
    • Має значення true, якщо ітератор досяг кінця послідовності, що перебирається. В цьому випадку value може містити значення, що повертається ітератором. Значення, що повертаються, пояснюються тут.
    • +
    • Має значення false, якщо ітератор був здатний надати наступне значення послідовності. Це аналогічно тому, щоб взагалі не вказувати значення властивості done.
    • +
    +
  • +
  • value - будь-яке значення JavaScript, що повертає ітератор. Його можна не вказувати, коли done дорівнює true.
  • +
+ +

Метод next завжди повинен повертати об'єкт з належними властивостями, в тому числі done та value. Якщо повертається значення, що не є об'єктом (наприклад, false чи undefined), буде викинуто помилку {{jsxref("TypeError")}} ("iterator.next() returned a non-object value").

+
+ +
+

Неможливо знати, чи певний об'єкт реалізує протокол ітератора, однак, можна легко створити об'єкт, який відповідає обом протоколам, ітератора та ітерабельного об'єкта (як показано нижче у прикладі). Це дозволяє використовувати ітератор там, де очікується ітерабельний об'єкт. Тому нечасто є потреба реалізовувати протокол ітератора, не реалізуючи також протокол ітерабельного об'єкта. 

+ +
var myIterator = {
+    next: function() {
+        // ...
+    },
+    [Symbol.iterator]: function() { return this }
+};
+
+
+ +

Приклади застосування протоколів перебору

+ +

Об'єкт {{jsxref("String")}} є прикладом вбудованого ітерабельного об'єкта:

+ +
var someString = '13';
+typeof someString[Symbol.iterator];          // "function"
+
+ +

Вбудований ітератор об'єкта String повертає коди символів рядка один за одним:

+ +
var iterator = someString[Symbol.iterator]();
+iterator + '';                               // "[object String Iterator]"
+
+iterator.next();                             // { value: "1", done: false }
+iterator.next();                             // { value: "3", done: false }
+iterator.next();                             // { value: undefined, done: true }
+ +

Деякі вбудовані конструкції, такі як оператор розпакування, використовують під капотом той самий протокол перебору:

+ +
[...someString]                              // ["1", "3"]
+ +

Ми можемо перевизначити поведінку під час перебору, надавши свій власний метод @@iterator:

+ +
var someString = new String('привіт');   // необхідно явно конструювати об'єкт String, щоб запобігти автопакуванню
+
+someString[Symbol.iterator] = function() {
+  return { // це ітератор, що повертає єдиний елемент, рядок "бувай"
+    next: function() {
+      if (this._first) {
+        this._first = false;
+        return { value: 'бувай', done: false };
+      } else {
+        return { done: true };
+      }
+    },
+    _first: true
+  };
+};
+
+ +

Зверніть увагу, як перевизначення методу @@iterator впливає на поведінку вбудованих конструкцій, що використовують протокол перебору:

+ +
[...someString];                             // ["бувай"]
+someString + '';                             // "привіт"
+
+ +

Приклади ітерабельних об'єктів

+ +

Вбудовані ітерабельні об'єкти

+ +

{{jsxref("String")}}, {{jsxref("Array")}}, {{jsxref("TypedArray")}}, {{jsxref("Map")}} та {{jsxref("Set")}} всі є вбудованими ітерабельними об'єктами, тому що кожний з їхніх прототипів реалізує метод @@iterator.

+ +

Створені користувачем ітерабельні об'єкти

+ +

Ми можемо створювати власні ітерабельні об'єкти наступним чином:

+ +
var myIterable = {};
+myIterable[Symbol.iterator] = function* () {
+    yield 1;
+    yield 2;
+    yield 3;
+};
+[...myIterable]; // [1, 2, 3]
+
+ +

Вбудовані API, що приймають ітерабельні об'єкти

+ +

Існує багато API, які приймають ітерабельні об'єкти, наприклад: {{jsxref("Map", "Map([iterable])")}}, {{jsxref("WeakMap", "WeakMap([iterable])")}}, {{jsxref("Set", "Set([iterable])")}} and {{jsxref("WeakSet", "WeakSet([iterable])")}}:

+ +
var myObj = {};
+new Map([[1, 'а'], [2, 'б'], [3, 'в']]).get(2);               // "б"
+new WeakMap([[{}, 'а'], [myObj, 'б'], [{}, 'в']]).get(myObj); // "б"
+new Set([1, 2, 3]).has(3);                               // true
+new Set('123').has('2');                                 // true
+new WeakSet(function* () {
+    yield {};
+    yield myObj;
+    yield {};
+}()).has(myObj);                                         // true
+
+ +

Дивіться також {{jsxref("Promise.all", "Promise.all(iterable)")}}, {{jsxref("Promise.race", "Promise.race(iterable)")}} та {{jsxref("Array.from", "Array.from()")}}.

+ +

Синтаксис, що очікує на ітерабельний об'єкт

+ +

Деякі оператори та вирази очікують на ітерабельні об'єкти, наприклад, цикли for-of, оператор розпакування, yield* та деструктуризаційне присвоєння:

+ +
for(let value of ['а', 'б', 'в']){
+    console.log(value);
+}
+// "а"
+// "б"
+// "в"
+
+[...'абв']; // ["а", "б", "в"]
+
+function* gen() {
+  yield* ['а', 'б', 'в'];
+}
+
+gen().next(); // { value:"а", done:false }
+
+[a, b, c] = new Set(['а', 'б', 'в']);
+a // "а"
+
+
+ +

Погано сформовані ітерабельні об'єкти

+ +

Якщо метод ітерабельного об'єкта @@iterator не повертає об'єкт ітератора, то це погано сформований ітерабельний об'єкт. Використання його в такому вигляді ймовірно призведе до викидання винятків під час виконання або помилкової поведінки:

+ +
var nonWellFormedIterable = {}
+nonWellFormedIterable[Symbol.iterator] = () => 1
+[...nonWellFormedIterable] // TypeError: [] is not a function
+
+ +

Приклади ітераторів

+ +

Простий ітератор

+ +
function makeIterator(array) {
+    var nextIndex = 0;
+
+    return {
+       next: function() {
+           return nextIndex < array.length ?
+               {value: array[nextIndex++], done: false} :
+               {done: true};
+       }
+    };
+}
+
+var it = makeIterator(['yo', 'ya']);
+
+console.log(it.next().value); // 'yo'
+console.log(it.next().value); // 'ya'
+console.log(it.next().done);  // true
+
+ +

Нескінченний ітератор

+ +
function idMaker() {
+    var index = 0;
+
+    return {
+       next: function(){
+           return {value: index++, done: false};
+       }
+    };
+}
+
+var it = idMaker();
+
+console.log(it.next().value); // '0'
+console.log(it.next().value); // '1'
+console.log(it.next().value); // '2'
+// ...
+
+ +

З генератором

+ +
function* makeSimpleGenerator(array) {
+    var nextIndex = 0;
+
+    while (nextIndex < array.length) {
+        yield array[nextIndex++];
+    }
+}
+
+var gen = makeSimpleGenerator(['yo', 'ya']);
+
+console.log(gen.next().value); // 'yo'
+console.log(gen.next().value); // 'ya'
+console.log(gen.next().done);  // true
+
+
+
+function* idMaker() {
+    var index = 0;
+    while (true)
+        yield index++;
+}
+
+var gen = idMaker();
+
+console.log(gen.next().value); // '0'
+console.log(gen.next().value); // '1'
+console.log(gen.next().value); // '2'
+// ...
+
+ +

З класом ES2015

+ +
class SimpleClass {
+  constructor(data) {
+    this.index = 0;
+    this.data = data;
+  }
+
+  [Symbol.iterator]() {
+    return {
+      next: () => {
+        if (this.index < this.data.length) {
+          return {value: this.data[this.index++], done: false};
+        } else {
+          this.index = 0; //Якщо ми хотіли б перебрати його знову, без примусового ручного оновлення індексу
+          return {done: true};
+        }
+      }
+    }
+  };
+}
+
+const simple = new SimpleClass([1,2,3,4,5]);
+
+for (const val of simple) {
+  console.log(val);  //'0' '1' '2' '3' '4' '5'
+}
+
+ +

Генератор є ітератором чи ітерабельним об'єктом?

+ +

Об'єкт генератор є одночасно ітератором та ітерабельним об'єктом:

+ +
var aGeneratorObject = function* () {
+    yield 1;
+    yield 2;
+    yield 3;
+}();
+typeof aGeneratorObject.next;
+// "function", бо він має метод next, отже, він ітератор
+typeof aGeneratorObject[Symbol.iterator];
+// "function", бо він має метод @@iterator, отже, він ітерабельний об'єкт
+aGeneratorObject[Symbol.iterator]() === aGeneratorObject;
+// true, бо його метод @@iterator повертає себе (ітератор),
+// отже, він добре сформований ітерабельний об'єкт
+[...aGeneratorObject];
+// [1, 2, 3]
+
+ +

Специфікації

+ + + + + + + + + + + + + + + + + + + +
СпецифікаціяСтатусКоментар
{{SpecName('ES2015', '#sec-iteration', 'Iteration')}}{{Spec2('ES2015')}}Початкова виознака.
{{SpecName('ESDraft', '#sec-iteration', 'Iteration')}}{{Spec2('ESDraft')}}
+ +

Див. також

+ + diff --git a/files/uk/web/javascript/reference/operators/arithmetic_operators/index.html b/files/uk/web/javascript/reference/operators/arithmetic_operators/index.html deleted file mode 100644 index 88128f5d99..0000000000 --- a/files/uk/web/javascript/reference/operators/arithmetic_operators/index.html +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: Арифметичні оператори -slug: Web/JavaScript/Reference/Operators/Arithmetic_Operators -tags: - - JavaScript - - Оператор -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Arithmetic_Operators ---- -
{{jsSidebar("Operators")}}
- -

Арифметичні оператори приймають числові значення (або літерали, або змінні) в якості операндів та повертають єдине числове значення. Стандартними арифметичними операторами є додавання (+), віднімання (-), множення (*) та ділення (/).

- -
{{EmbedInteractiveExample("pages/js/expressions-arithmetic.html")}}
- - - -

Додавання (+)

- -

Оператор додавання повертає суму числових операндів або об'єднання рядків.

- -

Синтаксис

- -
Оператор: x + y
-
- -

Приклади

- -
// Number + Number -> сума
-1 + 2 // 3
-
-// Boolean + Number -> сума
-true + 1 // 2
-
-// Boolean + Boolean -> сума
-false + false // 0
-
-// Number + String -> об'єднання
-5 + 'foo' // "5foo"
-
-// String + Boolean -> об'єднання
-'foo' + false // "foofalse"
-
-// String + String -> об'єднання
-'foo' + 'bar' // "foobar"
-
- -

Віднімання (-)

- -

Оператор віднімання проводить операцію віднімання між двома операндами, повертаючи різницю між ними.

- -

Синтаксис

- -
Оператор: x - y
-
- -

Приклади

- -
5 - 3 // 2
-3 - 5 // -2
-'foo' - 3 // NaN
- -

Ділення (/)

- -

Оператор ділення повертає частку своїх операндів, де лівий операнд є діленим, а правий операнд є дільником.

- -

Синтаксис

- -
Оператор: x / y
-
- -

Приклади

- -
1 / 2      // повертає 0.5 у JavaScript
-1 / 2      // повертає 0 у Java
-// (жодне з чисел не є явно числом з рухомою комою)
-
-1.0 / 2.0  // повертає 0.5 у JavaScript та Java
-
-2.0 / 0    // повертає Infinity у JavaScript
-2.0 / 0.0  // також повертає Infinity
-2.0 / -0.0 // повертає -Infinity у JavaScript
- -

Множення (*)

- -

Оператор множення повертає добуток операндів.

- -

Синтаксис

- -
Оператор: x * y
-
- -

Приклади

- -
2 * 2 // 4
--2 * 2 // -4
-Infinity * 0 // NaN
-Infinity * Infinity // Infinity
-'foo' * 2 // NaN
-
- -

Остача (%)

- -

Оператор остачі повертає остачу від ділення першого операнду на другий. Він завжди приймає знак діленого.

- -

Синтаксис

- -
Оператор: var1 % var2
-
- -

Приклади

- -
12 % 5 // 2
--1 % 2 // -1
-1 % -2 // 1
-NaN % 2 // NaN
-1 % 2 // 1
-2 % 3 // 2
--4 % 2 // -0
-5.5 % 2 // 1.5
-
- -

Піднесення до степеня (**)

- -

Оператор піднесення до степеня повертає результат піднесення першого операнду до показника степеня другого операнду. Тобто, var1var2 у наведеній інструкції, де var1 та var2 є змінними. Оператор піднесення до степеня правоасоціативний. a ** b ** c дорівнює a ** (b ** c).

- -

Синтаксис

- -
Оператор: var1 ** var2
-
- -

Примітки

- -

У більшості мов, таких як PHP, Python та інших, які мають оператор піднесення до степеня (**), оператор піднесення до степеня має вищий пріоритет, ніж унарні оператори, такі як унарний + та унарний -, але існує кілька винятків. Наприклад, у Bash оператор ** має нижчий пріоритет, ніж унарні оператори. У JavaScript неможливо написати неоднозначний вираз піднесення до степеня, тобто, ви не можете поставити унарний оператор (+/-/~/!/delete/void/typeof) одразу перед числом основи степеня.

- -
-2 ** 2;
-// 4 у Bash, -4 у інших мовах.
-// Це помилка у JavaScript, оскільки операція неоднозначна.
-
-
--(2 ** 2);
-// -4 у JavaScript, а наміри автора однозначні.
-
- -

Приклади

- -
2 ** 3 // 8
-3 ** 2 // 9
-3 ** 2.5 // 15.588457268119896
-10 ** -1 // 0.1
-NaN ** 2 // NaN
-
-2 ** 3 ** 2 // 512
-2 ** (3 ** 2) // 512
-(2 ** 3) ** 2 // 64
-
- -

Щоб поміняти знак результату виразу піднесення до степеня:

- -
-(2 ** 2) // -4
-
- -

Щоб зробити основу степеня у виразі від'ємним числом:

- -
(-2) ** 2 // 4
-
- -
-

Заувага: JavaScript також має бітовий оператор ^ (логічний XOR). ** та ^ відрізняються (наприклад: 2 ** 3 === 8, тоді як 2 ^ 3 === 1.)

-
- -

Інкремент (++)

- -

Оператор інкременту збільшує свій операнд (додає одиницю) та повертає його значення.

- - - -

Синтаксис

- -
Оператор: x++ або ++x
-
- -

Приклади

- -
// Постфіксний
-var x = 3;
-y = x++; // y = 3, x = 4
-
-// Префіксний
-var a = 2;
-b = ++a; // a = 3, b = 3
-
- -

Декремент (--)

- -

Оператор декременту зменшує свій операнд (віднімає одиницю) та повертає його значення.

- - - -

Синтаксис

- -
Оператор: x-- або --x
-
- -

Приклади

- -
// Постфіксний
-var x = 3;
-y = x--; // y = 3, x = 2
-
-// Префіксний
-var a = 2;
-b = --a; // a = 1, b = 1
-
- -

Унарний мінус (-)

- -

Унарний мінус ставиться перед своїм операндом та міняє його знак на протилежний.

- -

Синтаксис

- -
Оператор: -x
-
- -

Приклади

- -
var x = 3;
-y = -x; // y = -3, x = 3
-
-// Унарний мінус може перетворити нечислове значення на число
-var x = "4";
-y = -x; // y = -4
-
- -

Унарний плюс (+)

- -

Унарний плюс ставиться перед своїм операндом та повертає значення операнду, але намагається перетворити його на число, якщо він не є числом. Хоча унарний мінус (-) також вміє перетворювати нечислові значення, унарний плюс найшвидший та найкращий спосіб перетворити щось у число, тому що він не виконує ніяких інших операцій з числом. Він може перетворювати рядкові представлення цілих чисел та чисел з рухомою комою, а також нерядкові значення true, false та null. Підтримуються цілі числа у десятковому та шістнадцятковому форматах. Підтримуються від'ємні числа (хоча не у шістнадцятковому форматі). Якщо оператор не може розібрати певне значення, він поверне {{jsxref("NaN")}}.

- -

Синтаксис

- -
Оператор: +x
-
- -

Приклади

- -
+3     // 3
-+'3'   // 3
-+true  // 1
-+false // 0
-+null  // 0
-+function(val){ return val } // NaN
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ESDraft', '#sec-additive-operators')}}{{Spec2('ESDraft')}}
{{SpecName('ES2016', '#sec-postfix-expressions')}}{{Spec2('ES2016')}}Доданий Оператор піднесення до степеня.
{{SpecName('ES2017', '#sec-postfix-expressions')}}{{Spec2('ES2017')}}
{{SpecName('ES2015', '#sec-postfix-expressions')}}{{Spec2('ES2015')}}Визначені у кількох розділах специфікації: Адитивні оператори, мультиплікативні оператори, постфіксні вирази, унарні оператори.
{{SpecName('ES5.1', '#sec-11.3')}}{{Spec2('ES5.1')}}Визначені у кількох розділах специфікації: Адитивні оператори, мультиплікативні оператори, постфіксні вирази, унарні оператори.
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення.
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.operators.arithmetic")}}

- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/operators/bitwise_operators/index.html b/files/uk/web/javascript/reference/operators/bitwise_operators/index.html deleted file mode 100644 index 3107d5aa64..0000000000 --- a/files/uk/web/javascript/reference/operators/bitwise_operators/index.html +++ /dev/null @@ -1,560 +0,0 @@ ---- -title: Бітові оператори -slug: Web/JavaScript/Reference/Operators/Bitwise_Operators -tags: - - JavaScript - - Довідка - - Оператор -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Bitwise_Operators ---- -
{{jsSidebar("Operators")}}
- -

Бітові оператори опрацьовують свої операнди як послідовність 32-х бітів (нулів та одиниць), а не як десяткові, шістнадцяткові чи вісімкові числа. Наприклад, десяткове число дев'ять має бітове представлення 1001. Бітові оператори виконують операції над цими бітовими представленнями, але повертають стандартні числові значення JavaScript.

- -
{{EmbedInteractiveExample("pages/js/expressions-bitwiseoperators.html")}}
- - - -

Наступна таблиця наводить перелік бітових операторів JavaScript:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ОператорЗастосуванняОпис
Побітове І (AND)a & bПовертає 1 на кожній позиції, де відповідні біти обох операндів дорівнюють 1.
Побітове АБО (OR)a | bПовертає 1 на кожній позиції, де відповідні біти одного чи обох операндів дорівнюють 1.
Виключне побітове АБО (XOR)a ^ bПовертає 1 на кожній позиції, де відповідний біт одного з двох, але не обох, операндів дорівнює 1.
Побітове НЕ (NOT)~ aВиконує інверсію бітів операнду.
Лівий зсувa << bЗсуває a у двійковому представленні на b (< 32) бітів ліворуч, заповнюючи позиції справа нулями.
Правий зсув з розширенням знакуa >> bЗсуває a у двійковому представленні на b (< 32) бітів праворуч, відкидаючи зсунуті біти.
Правий зсув із заповненням нулямиa >>> b  Зсуває a у двійковому представленні на b (< 32) бітів праворуч, відкидаючи зсунуті біти та заповнюючи позиції зліва нулями.
- -

32-бітні цілі числа зі знаком

- -

Операнди усіх бітових операторів перетворюються на 32-бітні цілі числа зі знаком у форматі доповняльного коду, окрім оператора правого зсуву із заповненням нулями, який повертає беззнакове ціле 32-бітне число. Формат доповняльного коду означає, що від'ємний еквівалент числа (наприклад, 5 та -5) - це інвертовані біти числа (побітове НЕ, або обернений код числа) плюс один. Для прикладу, наступний код представляє ціле число 314:

- -
00000000000000000000000100111010
-
- -

Наступний код представляє ~314, тобто, обернений код числа 314:

- -
11111111111111111111111011000101
-
- -

Нарешті, наступний код представляє доповняльний код числа -314:

- -
11111111111111111111111011000110
-
- -

Доповняльний код гарантує, що лівий біт дорівнює 0, коли число є додатним, і 1, коли число є від'ємним. Тому він відомий як знаковий біт.

- -

Число 0 є цілим числом, усі біти якого дорівнюють 0.

- -
0 (основа 10) = 00000000000000000000000000000000 (основа 2)
-
- -

Число -1 є цілим числом, усі біти якого дорівнюють 1.

- -
-1 (основа 10) = 11111111111111111111111111111111 (основа 2)
-
- -

Число -2147483648 (шістнадцяткове представлення: -0x80000000) є цілим числом, усі біти якого дорівнюють 0, окрім першого (старшого) біта.

- -
-2147483648 (основа 10) = 10000000000000000000000000000000 (основа 2)
-
- -

Число 2147483647 (шістнадцяткове представлення: 0x7fffffff) є цілим числом, усі біти якого дорівнюють 1, окрім першого (старшого) біта.

- -
2147483647 (основа 10) = 01111111111111111111111111111111 (основа 2)
-
- -

Числа -2147483648 та 2147483647 є мінімальним та максимальним цілими числами, які можуть бути представлені 32-бітним знаковим числом.

- -

Побітові логічні оператори

- -

Концептуально побітові логічні оператори працюють наступним чином:

- - - -

& (Побітове І)

- -

Виконує операцію І (AND) над кожною парою бітів. a І b дає 1 тільки якщо обидва, a та b, дорівнюють 1. Таблиця істинності для операції І наступна:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
aba AND b
000
010
100
111
- -
.    9 (основа 10) = 00000000000000000000000000001001 (основа 2)
-    14 (основа 10) = 00000000000000000000000000001110 (основа 2)
-                   --------------------------------
-14 & 9 (основа 10) = 00000000000000000000000000001000 (основа 2) = 8 (основа 10)
-
- -

Побітове І над будь-яким числом x та 0 дає 0.

- -

| (Побітове АБО)

- -

Виконує операцію АБО (OR) над кожною парою бітів. a АБО b дає 1, якщо або a, або b дорівнює 1. Таблиця істинності для операції АБО наступна:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
aba OR b
000
011
101
111
- -
.    9 (основа 10) = 00000000000000000000000000001001 (основа 2)
-    14 (основа 10) = 00000000000000000000000000001110 (основа 2)
-                   --------------------------------
-14 | 9 (основа 10) = 00000000000000000000000000001111 (основа 2) = 15 (основа 10)
-
- -

Побітове АБО над будь-яким числом x та 0 дає x.

- -

^ (Виключне побітове АБО)

- -

Виконує операцію виключного АБО (XOR) над кожною парою бітів. a викл. АБО b дає 1, якщо a та b є різними. Таблиця істинності для операції XOR наступна:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
aba XOR b
000
011
101
110
- -
.    9 (основа 10) = 00000000000000000000000000001001 (основа 2)
-    14 (основа 10) = 00000000000000000000000000001110 (основа 2)
-                   --------------------------------
-14 ^ 9 (основа 10) = 00000000000000000000000000000111 (основа 2) = 7 (основа 10)
-
- -

Виключне побітове АБО над будь-яким числом x та 0 дає x.

- -

~ (Побітове НЕ)

- -

Виконує операцію НЕ над кожним бітом. НЕ a повертає інвертоване значення (або обернений код) операнду a. Таблиця істинності для операції НЕ наступна:

- - - - - - - - - - - - - - - - -
aNOT a
01
10
- -
 9 (основа 10) = 00000000000000000000000000001001 (основа 2)
-               --------------------------------
-~9 (основа 10) = 11111111111111111111111111110110 (основа 2) = -10 (основа 10)
-
- -

Побітове НЕ над будь-яким числом x дає -(x + 1). Наприклад, ~-5 дорівнює 4.

- -

Зауважте, що через використання 32-бітного представлення чисел і ~-1, і ~4294967295 (232-1) повернуть 0.

- -

Оператори бітового зсуву

- -

Оператори бітового зсуву приймають два операнди: перший є величиною, в якій треба виконати зсув, а другий вказує кількість бітових позицій для зсуву. Напрямок операції зсуву контролюється застосованим оператором.

- -

Оператори зсуву перетворюють свої операнди на 32-бітні цілі числа у порядку від старшого до молодшого байту та повертають результат того самого типу, до якого належить лівий операнд. Лише молодші п'ять бітів правого операнду будуть використані.

- -

<< (Лівий зсув)

- -

Цей оператор виконує зсув першого операнду на вказану кількість бітів ліворуч. Надлишкові біти, зсунуті ліворуч, відкидаються. Біти, додані справа, заповнюються нулями.

- -

Наприклад, 9 << 2 дорівнює 36:

- -
.    9 (основа 10): 00000000000000000000000000001001 (основа 2)
-                  --------------------------------
-9 << 2 (основа 10): 00000000000000000000000000100100 (основа 2) = 36 (основа 10)
-
- -

Бітовий зсув будь-якого числа x ліворуч на y бітів дорівнює x * 2 ** y.
- Отже, для прикладу: 9 << 3 можна перекласти як: 9 * (2 ** 3) = 9 * (8) = 72.

- -

>> (Правий зсув з розширенням знаку)

- -

Цей оператор виконує зсув першого операнду на вказану кількість бітів праворуч. Надлишкові біти, зсунуті праворуч, відкидаються. Біти, додані зліва, заповнюються значенням старшого біта. Оскільки новий старший біт матиме те саме значення, що й попередній старший біт, знаковий (старший) біт не змінюється. Звідси назва "з розширенням знаку".

- -

Наприклад, 9 >> 2 дорівнює 2:

- -
.    9 (основа 10): 00000000000000000000000000001001 (основа 2)
-                  --------------------------------
-9 >> 2 (основа 10): 00000000000000000000000000000010 (основа 2) = 2 (основа 10)
-
- -

Аналогічно, -9 >> 2 дорівнює -3, оскільки знак зберігається:

- -
.    -9 (основа 10): 11111111111111111111111111110111 (основа 2)
-                   --------------------------------
--9 >> 2 (основа 10): 11111111111111111111111111111101 (основа 2) = -3 (основа 10)
-
- -

>>> (Правий зсув із заповненням нулями)

- -

Цей оператор виконує зсув першого операнду на вказану кількість бітів праворуч. Надлишкові біти, зсунуті праворуч, відкидаються. Біти, додані зліва, заповнюються нулями. Знаковий біт отримує значення 0, а отже, результат завжди невід'ємний. На відміну від інших бітових операторів, правий зсув із заповненням нулями повертає беззнакове ціле 32-бітне число.

- -

Для невід'ємних чисел, правий зсув із заповненням нулями та правий зсув з розширенням знаку дають однаковий результат. Наприклад, 9 >>> 2 дорівнює 2, так само, як 9 >> 2:

- -
.     9 (основа 10): 00000000000000000000000000001001 (основа 2)
-                   --------------------------------
-9 >>> 2 (основа 10): 00000000000000000000000000000010 (основа 2) = 2 (основа 10)
-
- -

Однак, це не одне й те саме для від'ємних чисел. Наприклад, -9 >>> 2 поверне 1073741821, що відрізняється від -9 >> 2 (що дорівнює -3):

- -
.     -9 (основа 10): 11111111111111111111111111110111 (основа 2)
-                    --------------------------------
--9 >>> 2 (основа 10): 00111111111111111111111111111101 (основа 2) = 1073741821 (основа 10)
-
- -

Приклади

- -

Прапори та бітові маски

- -

Побітові логічні оператори часто використовуються для створення, маніпулювання та читання послідовностей прапорів, які грають роль двійкових змінних. Замість цих послідовностей можуть використовуватись зміні, але двійкові прапори займають набагато менше пам'яті (у 32 рази).

- -

Припустимо, є 4 прапори:

- - - -

Ці прапори представлені послідовністю бітів: DCBA. Коли прапор встановлений, він має значення 1. Коли прапор очищений, він має значення 0. Припустимо, змінна flags має двійкове значення 0101:

- -
var flags = 5;   // двійкове значення 0101
-
- -

Це значення вказує:

- - - -

Оскільки бітові операнди 32-бітні, 0101 насправді дорівнює 00000000000000000000000000000101, але нулями попереду можна знехтувати, оскільки вони не містять корисної інформації.

- -

Бітова маска - це послідовність бітів, які можуть маніпулювати прапорами та/або читати їх. Зазвичай, визначається "примітивна" бітова маска для кожного прапора:

- -
var FLAG_A = 1; // 0001
-var FLAG_B = 2; // 0010
-var FLAG_C = 4; // 0100
-var FLAG_D = 8; // 1000
-
- -

Нові бітові маски можуть створюватись застовуванням побітових логічних операторів до цих примітивних бітових масок. Наприклад, бітова маска 1011 може бути створена операцією АБО з прапорів FLAG_A, FLAG_B та FLAG_D:

- -
var mask = FLAG_A | FLAG_B | FLAG_D; // 0001 | 0010 | 1000 => 1011
-
- -

Індивідуальні значення прапорів можна витягнути застосуванням операції І до них та бітової маски, де кожний біт, що має значення один, "витягне" відповідний прапор. Бітова маска маскує невідповідні прапори, об'єднуючи їх операцією І з нулями (звідси термін "бітова маска"). Наприклад, бітову маску 0100 можна використати, щоб побачити, чи встановлений прапор C:

- -
// якщо ми маємо кота
-if (flags & FLAG_C) { // 0101 & 0100 => 0100 => true
-   // зробити щось
-}
-
- -

Бітова маска з кількома встановленими прапорами діє як "або/або". Для прикладу, наступні два фрагменти еквівалентні:

- -
// якщо ми маємо кажана або ми маємо кота
-// (0101 & 0010) || (0101 & 0100) => 0000 || 0100 => true
-if ((flags & FLAG_B) || (flags & FLAG_C)) {
-   // зробити щось
-}
-
- -
// якщо ми маємо кажана або кота
-var mask = FLAG_B | FLAG_C; // 0010 | 0100 => 0110
-if (flags & mask) { // 0101 & 0110 => 0100 => true
-   // зробити щось
-}
-
- -

Прапори можна встановити, об'єднавши їх операцією АБО з бітовою маскою, де кожний біт, що має значення один, встановить відповідний прапор, якщо прапор ще не встановлений. Наприклад, бітову маску 1100 можна використати, щоб встановити прапори C та D:

- -
// так, ми маємо кота та качку
-var mask = FLAG_C | FLAG_D; // 0100 | 1000 => 1100
-flags |= mask;   // 0101 | 1100 => 1101
-
- -

Прапори можна очистити, об'єднавши їх операцією І з бітовою маскою, де кожний біт, що має значення нуль, очистить відповідний прапор, якщо він ще не очищений. Ця бітова маска може бути створена застосуванням операції НЕ до примітивних бітових масок. Наприклад, бітову маску 1010 можна використати, щоб очистити прапори A та C:

- -
// ні, ми не маємо проблеми з мурахами або кота
-var mask = ~(FLAG_A | FLAG_C); // ~0101 => 1010
-flags &= mask;   // 1101 & 1010 => 1000
-
- -

Маску також можна створити за допомогою ~FLAG_A & ~FLAG_C (правило де Моргана):

- -
// ні, ми не маємо проблеми з мурахами і ми не маємо кота
-var mask = ~FLAG_A & ~FLAG_C;
-flags &= mask;   // 1101 & 1010 => 1000
-
- -

Прапори можна перемикати, об'єднуючи їх операцією виключне АБО з бітовою маскою, де кожний біт, що має значення один, переключить відповідний прапор. Наприклад, бітову маску 0110 можна використати, щоб переключити прапори B та C:

- -
// якщо ми не мали кажана, тепер ми його маємо,
-// а якщо він в нас був, бувай, кажанчику
-// те саме для котів
-var mask = FLAG_B | FLAG_C;
-flags = flags ^ mask;   // 1100 ^ 0110 => 1010
-
- -

Нарешті, усі прапори можна перевернути оператором НЕ:

- -
// входимо у паралельний всесвіт...
-flags = ~flags;    // ~1010 => 0101
-
- -

Перетворення типів

- -

Перетворити двійковий рядок на десяткове число:

- -
var sBinString = '1011';
-var nMyNumber = parseInt(sBinString, 2);
-alert(nMyNumber); // виводить 11, тобто 1011
-
- -

Перетворити десяткове число на двійковий рядок:

- -
var nMyNumber = 11;
-var sBinString = nMyNumber.toString(2);
-alert(sBinString); // виводить 1011, тобто 11
-
- -

Автоматизація створення маски

- -

Ви можете створювати маски з набору булевих значень наступним чином:

- -
function createMask() {
-  var nMask = 0, nFlag = 0, nLen = arguments.length > 32 ? 32 : arguments.length;
-  for (nFlag; nFlag < nLen; nMask |= arguments[nFlag] << nFlag++);
-  return nMask;
-}
-var mask1 = createMask(true, true, false, true); // 11, тобто: 1011
-var mask2 = createMask(false, false, true); // 4, тобто: 0100
-var mask3 = createMask(true); // 1, тобто: 0001
-// і т.д.
-
-alert(mask1); // виводить 11, тобто: 1011
-
- -

Зворотний алгоритм: отримання масиву булевих значень з маски

- -

Якщо ви бажаєте створити масив булевих значень з маски, можете скористатись цим кодом:

- -
function arrayFromMask(nMask) {
-  // Значенння nMask має бути між -2147483648 та 2147483647
-  if (nMask > 0x7fffffff || nMask < -0x80000000) {
-    throw new TypeError('arrayFromMask - out of range');
-  }
-  for (var nShifted = nMask, aFromMask = []; nShifted;
-       aFromMask.push(Boolean(nShifted & 1)), nShifted >>>= 1);
-  return aFromMask;
-}
-
-var array1 = arrayFromMask(11);
-var array2 = arrayFromMask(4);
-var array3 = arrayFromMask(1);
-
-alert('[' + array1.join(', ') + ']');
-// виводить "[true, true, false, true]", тобто: 11, тобто: 1011
-
- -

Ви можете перевірити обидва алгоритми одночасно…

- -
var nTest = 19; // наша користувацька маска
-var nResult = createMask.apply(this, arrayFromMask(nTest));
-
-alert(nResult); // 19
-
- -

Суто з навчальною метою (оскільки існує метод Number.toString(2)) ми показуємо, як можна модифікувати алгоритм arrayFromMask для створення рядка, що містить двійкове представлення числа, а не масиву булевих значень:

- -
function createBinaryString(nMask) {
-  // Значення nMask має бути між -2147483648 та 2147483647
-  for (var nFlag = 0, nShifted = nMask, sMask = ''; nFlag < 32;
-       nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
-  return sMask;
-}
-
-var string1 = createBinaryString(11);
-var string2 = createBinaryString(4);
-var string3 = createBinaryString(1);
-
-alert(string1);
-// виводить 00000000000000000000000000001011, тобто 11
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-11.7')}}{{Spec2('ES5.1')}}Визначені у кількох розділах специфікації: Побітовий оператор НЕ, Бітові оператори зсуву, Двійкові побітові оператори
{{SpecName('ES6', '#sec-bitwise-shift-operators')}}{{Spec2('ES6')}}Визначені у кількох розділах специфікації: Побітовий оператор НЕ, Бітові оператори зсуву, Двійкові побітові оператори
{{SpecName('ESDraft', '#sec-bitwise-shift-operators')}}{{Spec2('ESDraft')}}Визначені у кількох розділах специфікації: Побітовий оператор НЕ, Бітові оператори зсуву, Двійкові побітові оператори
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.operators.bitwise")}}

- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/operators/destructuring_assignment/index.html b/files/uk/web/javascript/reference/operators/destructuring_assignment/index.html new file mode 100644 index 0000000000..4967086ede --- /dev/null +++ b/files/uk/web/javascript/reference/operators/destructuring_assignment/index.html @@ -0,0 +1,453 @@ +--- +title: Деструктуризація +slug: Web/JavaScript/Reference/Operators/Деструктуризація +tags: + - Destructuring + - ECMAScript 2015 + - JavaScript + - Operator + - Деструктуризація + - Оператор +translation_of: Web/JavaScript/Reference/Operators/Destructuring_assignment +--- +
{{jsSidebar("Operators")}}
+ +

Деструктуризація (деструктуризаційне присвоєння) - JavaScript вираз, який дозволяє витягувати дані з масивів та об’єктів в окремі змінні.

+ +

Синтаксис

+ +
var a, b, rest;
+[a, b] = [10, 20];
+console.log(a); // 10
+console.log(b); // 20
+
+[a, b, ...rest] = [10, 20, 30, 40, 50];
+console.log(a); // 10
+console.log(b); // 20
+console.log(rest); // [30, 40, 50]
+
+({a, b} = {a: 10, b: 20});
+console.log(a); // 10
+console.log(b); // 20
+
+// Експерементальний синтаксис (ще не стандартизований)
+({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
+
+ +

Опис

+ +

Вирази присвоєння літералів об’єктів та масивів надають простий спосіб створювати ad hoc (ад-гок) структури даних.

+ +
var x = [1, 2, 3, 4, 5];
+ +

Деструктуризаційне присвоєння використовує подібний синтаксис, де ліва сторона виразу визначає елементи, що потрібно витягнути зі змінної-джерела (правої сторони).

+ +
var x = [1, 2, 3, 4, 5];
+var [y, z] = x;
+console.log(y); // 1
+console.log(z); // 2
+
+ +

Це подібне до способів, що доступні у мовах програмування на кшталт Perl та Python.

+ +

Деструктуризація масивів

+ +

Звичайне присвоєння

+ +
var foo = ['one', 'two', 'three'];
+
+var [one, two, three] = foo;
+console.log(one); // "one"
+console.log(two); // "two"
+console.log(three); // "three"
+
+ +

Присвоєння, окреме від оголошення

+ +

Значення може бути присвоєне змінній окремо від оголошення цієї змінної.

+ +
var a, b;
+
+[a, b] = [1, 2];
+console.log(a); // 1
+console.log(b); // 2
+
+ +

Значення за промовчанням

+ +

Змінній може бути присвоєне значення за промовчанням у випадку, коли витягнуте значення є undefined.

+ +
var a, b;
+
+[a=5, b=7] = [1];
+console.log(a); // 1
+console.log(b); // 7
+
+ +

Обмін змінних

+ +

Дві змінні можуть обмінятися значеннями за допомогою одного деструктуризаційного виразу. 

+ +

Без деструктуризації, обмін двох значеннь потребує тимчасової змінної (або в деяких низькорівневих мовах XOR-обміну).

+ +
var a = 1;
+var b = 3;
+
+[a, b] = [b, a];
+console.log(a); // 3
+console.log(b); // 1
+
+ +

Розбір масиву, поверненого з функції

+ +

Завжди було можливо повернути масив із функції. Деструктуризація може зробити обробку повернутого масиву більш виразною.

+ +

У цьому прикладі f() повертає значення [1, 2], які можуть бути розібрані одним рядком коду за допомогою деструктуризації.

+ +
function f() {
+  return [1, 2];
+}
+
+var a, b;
+[a, b] = f();
+console.log(a); // 1
+console.log(b); // 2
+
+ +

Пропуск деяких значень

+ +

Можна пропустити повернуті значення, які тобі не цікаві:

+ +
function f() {
+  return [1, 2, 3];
+}
+
+var [a, , b] = f();
+console.log(a); // 1
+console.log(b); // 3
+
+ +

Також можна пропустити всі значення (але навіщо?):

+ +
[,,] = f();
+
+ +

Присвоєння решти масиву змінній

+ +

Деструктуризуючи масив, можна присвоїти змінній решту його елементів за допомогою оператора розпакування:

+ +
var [a, ...b] = [1, 2, 3];
+console.log(a); // 1
+console.log(b); // [2, 3]
+ +

Зауваж, що буде видана помилка {{jsxref("SyntaxError")}}, якщо поставити прикінцеву кому в лівій частині виразу за елементом решти:

+ +
var [a, ...b,] = [1, 2, 3];
+// SyntaxError: елемент решти не може мати прикінцевої коми
+ +

Витягнення значеннь з масиву збігів регулярного виразу

+ +

Коли метод регулярного виразу exec() знаходить збіг, він повертає масив, що містить першим елементом повністю відповідну частину рядку, а далі частини рядку, що збіглися з кожною взятою в дужки групою в регулярному виразі. Деструктуризаційне присвоєння дозволяє з легкістю витягувати частини цього масиву, пропускаючи повний збіг, якщо він не потрібний.

+ +
var url = 'https://developer.mozilla.org/en-US/Web/JavaScript';
+
+var parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
+console.log(parsedURL); // ["https://developer.mozilla.org/en-US/Web/JavaScript", "https", "developer.mozilla.org", "en-US/Web/JavaScript"]
+
+var [, protocol, fullhost, fullpath] = parsedURL;
+
+console.log(protocol); // "https"
+
+ +

Деструктуризація об’єктів

+ +

Звичайне присвоєння

+ +
var o = {p: 42, q: true};
+var {p, q} = o;
+
+console.log(p); // 42
+console.log(q); // true
+
+ +

Присвоєння, окреме від оголошення

+ +

Значення може бути присвоєне змінній окремо від оголошення цієї змінної.

+ +
var a, b;
+
+({a, b} = {a: 1, b: 2});
+ +
+

Дужки ( .. ) навколо виразу присвоєння необхідні при деструктуризаційному присвоєні об’єкта без оголошення.

+ +

Вираз {a, b} = {a: 1, b: 2} сам по собі є синтаксично неправильним, оскільки {a, b} в лівій його частині розглядається як блок коду, а не як об’єкт.

+ +

Проте, ({a, b} = {a: 1, b: 2}) є правильним, як і var {a, b} = {a: 1, b: 2}

+
+ +

Присвоєння новим змінним

+ +

Значення може бути отримане з об’єкту та присвоєне змінній з іменем, інакшим від назви властивості об’єкта.

+ +
var o = {p: 42, q: true};
+var {p: foo, q: bar} = o;
+
+console.log(foo); // 42
+console.log(bar); // true  
+ +

Значення за промовчанням

+ +

Змінній може бути присвоєне значення за промовчанням у випадку, коли витягнуте значення з об’єкту є undefined.

+ +
var {a = 10, b = 5} = {a: 3};
+
+console.log(a); // 3
+console.log(b); // 5
+ +

Встановлення значення за промовчанням аргументам функції

+ +

ES5 версія

+ +
function drawES5Chart(options) {
+  options = options === undefined ? {} : options;
+  var size = options.size === undefined ? 'big' : options.size;
+  var cords = options.cords === undefined ? {x: 0, y: 0} : options.cords;
+  var radius = options.radius === undefined ? 25 : options.radius;
+  console.log(size, cords, radius);
+  // тепер, врешті, малюй діаграму
+}
+
+drawES5Chart({
+  cords: {x: 18, y: 30},
+  radius: 30
+});
+ +

ES2015 версія

+ +
function drawES2015Chart({size = 'big', cords = {x: 0, y: 0}, radius = 25} = {}) {
+  console.log(size, cords, radius);
+  // малюй діаграму
+}
+
+drawES2015Chart({
+  cords: {x: 18, y: 30},
+  radius: 30
+});
+ +

Вкладена деструктуризація об’єктів та масивів

+ +
var metadata = {
+    title: 'Scratchpad',
+    translations: [
+       {
+        locale: 'de',
+        localization_tags: [],
+        last_edit: '2014-04-14T08:43:37',
+        url: '/de/docs/Tools/Scratchpad',
+        title: 'JavaScript-Umgebung'
+       }
+    ],
+    url: '/en-US/docs/Tools/Scratchpad'
+};
+
+var {title: englishTitle, translations: [{title: localeTitle}]} = metadata;
+
+console.log(englishTitle); // "Scratchpad"
+console.log(localeTitle);  // "JavaScript-Umgebung"
+ +

For of цикл та деструктуризація

+ +
var people = [
+  {
+    name: 'Mike Smith',
+    family: {
+      mother: 'Jane Smith',
+      father: 'Harry Smith',
+      sister: 'Samantha Smith'
+    },
+    age: 35
+  },
+  {
+    name: 'Tom Jones',
+    family: {
+      mother: 'Norah Jones',
+      father: 'Richard Jones',
+      brother: 'Howard Jones'
+    },
+    age: 25
+  }
+];
+
+for (var {name: n, family: {father: f}} of people) {
+  console.log('Name: ' + n + ', Father: ' + f);
+}
+
+// "Name: Mike Smith, Father: Harry Smith"
+// "Name: Tom Jones, Father: Richard Jones"
+ +

Витягнення полів з об’єктів, що передані аргументами в функцію

+ +
function userId({id}) {
+  return id;
+}
+
+function whois({displayName, fullName: {firstName: name}}) {
+  console.log(displayName + ' is ' + name);
+}
+
+var user = {
+  id: 42,
+  displayName: 'jdoe',
+  fullName: {
+      firstName: 'John',
+      lastName: 'Doe'
+  }
+};
+
+console.log('userId: ' + userId(user)); // "userId: 42"
+whois(user); // "jdoe is John"
+ +

Це витягує id, displayName та firstName з об’єкта user та виводить їх.

+ +

Розраховувані імена властивостей об’єкта та деструктуризація

+ +

Розраховувані імена властивостей об’єкта можуть також бути використані разом із деструктуризацією

+ +
let key = 'z';
+let {[key]: foo} = {z: 'bar'};
+
+console.log(foo); // "bar"
+
+ +

Специфікації

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES2015', '#sec-destructuring-assignment', 'Destructuring assignment')}}{{Spec2('ES2015')}}Initial definition.
{{SpecName('ESDraft', '#sec-destructuring-assignment', 'Destructuring assignment')}}{{Spec2('ESDraft')}} 
+ +

Сумісність з браузерами 

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureChromeFirefox (Gecko)EdgeInternet ExplorerOperaSafari
Basic support{{CompatChrome(49.0)}}{{ CompatGeckoDesktop("1.8.1") }}14{{CompatNo}}{{CompatNo}}7.1
Computed property names{{CompatChrome(49.0)}}{{ CompatGeckoDesktop("34") }}14{{CompatNo}}{{CompatNo}}{{CompatNo}}
Spread operator{{CompatChrome(49.0)}}{{ CompatGeckoDesktop("34") }}12[1]{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Basic support{{CompatNo}}{{CompatChrome(49.0)}}{{ CompatGeckoMobile("1.0") }}{{CompatNo}}{{CompatNo}}8{{CompatChrome(49.0)}}
Computed property names{{CompatNo}}{{CompatChrome(49.0)}}{{ CompatGeckoMobile("34") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatChrome(49.0)}}
Spread operator{{CompatNo}}{{CompatChrome(49.0)}}{{ CompatGeckoMobile("34") }}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatChrome(49.0)}}
+
+ +

[1] Потребує ввімкнення "Enable experimental Javascript features" в налаштуваннях `about:flags`

+ +

Примітки для Firefox

+ + + +

Дивись також

+ + diff --git a/files/uk/web/javascript/reference/operators/logical_operators/index.html b/files/uk/web/javascript/reference/operators/logical_operators/index.html deleted file mode 100644 index ea1edb506a..0000000000 --- a/files/uk/web/javascript/reference/operators/logical_operators/index.html +++ /dev/null @@ -1,253 +0,0 @@ ---- -title: Логічні оператори -slug: Web/JavaScript/Reference/Operators/Logical_Operators -tags: - - JavaScript - - Оператор - - логічний -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Logical_Operators ---- -
{{jsSidebar("Operators")}}
- -

Логічні оператори зазвичай застосовуються до {{jsxref("Boolean", "булевих")}} (логічних) значень. В цьому випадку вони повертають значення типу Boolean. Однак, оператори && та || насправді повертають значення одного з заданих операндів, тому, якщо ці оператори використовуються зі значеннями не булевого типу, вони повернуть значення не булевого типу.

- -
{{EmbedInteractiveExample("pages/js/expressions-logicaloperator.html")}}
- - - -

Опис

- -

Логічні оператори описані у наведеній нижче таблиці (вирази expr можуть належати до будь-якого типу, не лише булевого):

- - - - - - - - - - - - - - - - - - - - - - - - -
ОператорСинтаксисОпис
Логічне І (&&)expr1 && expr2Якщо вираз expr1 може бути приведений до true, вертає expr2; інакше, вертає expr1.
Логічне АБО (||)expr1 || expr2Якщо вираз expr1 може бути приведений до true, вертає expr1; інакше, вертає expr2.
Логічне НЕ (!)!exprВертає false, якщо його єдиний операнд може бути приведений до true; інакше, вертає true.
- -

Якщо значення може бути приведене до true, то воно називається {{Glossary("truthy","правдивим")}}. Якщо значення може бути приведене до false, воно називається {{Glossary("falsy","хибним")}}.

- -

Приклади виразів, які можуть бути приведені до false:

- - - -

Хоча оператори && та || можуть використовуватись з операндами не булевого (логічного) типу, вони все одно можуть вважатися логічними операторами, оскільки значення, які вони повертають, завжди можуть бути приведені до булевих примітивів. Щоб явно перетворити повернені значення (або, взагалі, будь-який вираз) до відповідного булевого значення, скористайтесь подвійним оператором НЕ або конструктором Boolean.

- -

Коротке замикання обчислення

- -

Оскільки логічні вирази обчислюються зліва направо, вони перевіряються на можливе "коротке замикання" обчислення за наступними правилами:

- - - -

Коротке замикання означає, що наведені вирази expr не обчислюються, тому будь-які побічні ефекти від цього не відбудуться (наприклад, якщо expr є викликом функції, виклик не відбувається). Це відбувається тому, що значення оператора вже визначене після обчислення першого операнду. Дивіться приклад:

- -
function A(){ console.log('викликано A'); return false; }
-function B(){ console.log('викликано B'); return true; }
-
-console.log( A() && B() );
-// виводить "викликано A" в результаті виклику функції,
-// потім виводить false (що є результатом виклику оператора)
-
-console.log( B() || A() );
-// виводить "викликано B" в результаті виклику функції,
-// потім виводить true (що є результатом виклику оператора)
-
- -

Пріоритет операторів

- -

Наступні вирази можуть виглядати еквівалентними, але це не так, оскільки оператор && виконується перед оператором || (дивіться Пріоритет операторів).

- -
true || false && false      // вертає true, оскільки && виконується першим
-(true || false) && false    // вертає false, оскільки не можна застосувати пріоритет операторів
- -

Логічне І (&&)

- -

Наступний код наводить приклади оператора && (логічне І).

- -
a1 = true  && true       // t && t вертає true
-a2 = true  && false      // t && f вертає false
-a3 = false && true       // f && t вертає false
-a4 = false && (3 == 4)   // f && f вертає false
-a5 = 'Кіт' && 'Пес'      // t && t вертає "Пес"
-a6 = false && 'Кіт'      // f && t вертає false
-a7 = 'Кіт' && false      // t && f вертає false
-a8 = ''    && false      // f && f вертає ""
-a9 = false && ''         // f && f вертає false
-
- -

Логічне АБО (||)

- -

Наступний код наводить приклади оператора || (логічне АБО).

- -
o1 = true  || true       // t || t вертає true
-o2 = false || true       // f || t вертає true
-o3 = true  || false      // t || f вертає true
-o4 = false || (3 == 4)   // f || f вертає false
-o5 = 'Кіт' || 'Пес'      // t || t вертає "Кіт"
-o6 = false || 'Кіт'      // f || t вертає "Кіт"
-o7 = 'Кіт' || false      // t || f вертає "Кіт"
-o8 = ''    || false      // f || f вертає false
-o9 = false || ''         // f || f вертає ""
-o10 = false || varObject // f || object вертає varObject
-
- -
-

Заувага: Якщо ви використовуєте цей оператор для присвоєння значення за замовчуванням якійсь змінній, пам'ятайте, що будь-яке хибне значення не буде використане. Якщо вам потрібно лише відфільтрувати {{jsxref("null")}} або {{jsxref("undefined")}}, розгляньте оператор null-об'єднання (однак, станом на листопад 2019 ця функціональність ще не була широко реалізована і має вважатися експериментальною, оскільки знаходиться на Стадії 3).

-
- -

Логічне НЕ (!)

- -

Наступний код демонструє приклади оператора ! (логічне НЕ).

- -
n1 = !true               // !t вертає false
-n2 = !false              // !f вертає true
-n3 = !''                 // !f вертає true
-n4 = !'Cat'              // !t вертає false
-
- -

Подвійне НЕ (!!)

- -

Можна використовувати пару операторів НЕ поспіль, щоб явно викликати перетворення будь-якої величини на відповідний булевий примітив. Перетворення базується на "правдивості" або "хибності" значення (дивіться {{Glossary("truthy")}} та {{Glossary("falsy")}}).

- -

Таке саме перетворення можна виконати функцією {{jsxref("Boolean")}}.

- -
n1 = !!true                   // !!truthy вертає true
-n2 = !!{}                     // !!truthy вертає true: будь-який об'єкт є правдивим...
-n3 = !!(new Boolean(false))   // ...навіть об'єкти Boolean з false .valueOf()!
-n4 = !!false                  // !!falsy вертає false
-n5 = !!""                     // !!falsy вертає false
-n6 = !!Boolean(false)         // !!falsy вертає false
-
- -

Правила перетворення для булевих значень

- -

Перетворення І на АБО

- -

Наступна операція з булевими значеннями:

- -
умова1 && умова2
- -

завжди дорівнює:

- -
!(!умова1 || !умова2)
- -

Перетворення АБО на І

- -

Наступна операція з булевими значеннями:

- -
умова1 || умова2
- -

завжди дорівнює:

- -
!(!умова1 && !умова2)
- -

Перетворення НЕ

- -

Наступна операція з булевими значеннями:

- -
!!умова
- -

завжди дорівнює:

- -
умова
- -

Прибирання вкладених дужок

- -

Оскільки логічні вирази обчислюються зліва направо, завжди можна прибрати дужки зі складного виразу, дотримуючись деяких правил.

- -

Прибирання вкладеного І

- -

Наступна складена операція з булевими значеннями:

- -
умова1 || (умова2 && умова3)
- -

завжди дорівнює:

- -
умова1 || умова2 && умова3
- -

Прибирання вкладеного АБО

- -

Наступна складена операція з булевими значеннями:

- -
умова1 && (умова2 || умова3)
- -

завжди дорівнює:

- -
!(!умова1 || !умова2 && !умова3)
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення.
{{SpecName('ES5.1', '#sec-11.11')}}{{Spec2('ES5.1')}}Визначені у кількох розділах специфікації: Логічний оператор НЕ, Бінарні логічні оператори
{{SpecName('ES6', '#sec-binary-logical-operators')}}{{Spec2('ES6')}}Визначені у кількох розділах специфікації: Логічний оператор НЕ, Бінарні логічні оператори
{{SpecName('ESDraft', '#sec-binary-logical-operators')}}{{Spec2('ESDraft')}}Визначені у кількох розділах специфікації: Логічний оператор НЕ, Бінарні логічні оператори
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.operators.logical")}}

- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/operators/object_initializer/index.html b/files/uk/web/javascript/reference/operators/object_initializer/index.html new file mode 100644 index 0000000000..00d1497164 --- /dev/null +++ b/files/uk/web/javascript/reference/operators/object_initializer/index.html @@ -0,0 +1,296 @@ +--- +title: Ініціалізатор об’єкта +slug: Web/JavaScript/Reference/Operators/Ініціалізація_об’єктів +tags: + - ECMAScript 2015 + - JSON + - JavaScript + - Об'єкт + - властивості + - літерал + - методи + - мутація + - обчислені +translation_of: Web/JavaScript/Reference/Operators/Object_initializer +--- +
{{JsSidebar("Operators")}}
+ +

Об'єкти можна ініціалізувати через new Object()Object.create(), або за допомогою літеральної нотації (нотації ініціалізатора). Ініціалізатор об'єкта - це список з нуля або більше розділених комою пар імен властивостей та асоційованих з ними значень об'єкта, записаних у фігурних дужках ({}).

+ +

{{EmbedInteractiveExample("pages/js/expressions-objectinitializer.html", "taller")}}

+ + + +

Синтаксис

+ +
let o = {}
+let o = {a: 'няв', b: 42, c: {}}
+
+let a = 'няв', b = 42, c = {}
+let o = {a: a, b: b, c: c}
+
+let o = {
+  property: function ([parameters]) {},
+  get property() {},
+  set property(value) {}
+};
+
+ +

Нові позначення у ECMAScript 2015

+ +

Будь ласка, перевірте підтримку цих позначень у таблиці сумісностей. У тих середовищах, де вони не підтримуються, вони призведуть до синтаксичних помилок.

+ +
// Скорочений запис імен властивостей (ES2015)
+let a = 'привіт', b = 42, c = {};
+let o = {a, b, c}
+
+// Скорочений запис імен методів (ES2015)
+let o = {
+  property([parameters]) {}
+}
+
+// Обчислювані імена властивостей (ES2015)
+let prop = 'foo'
+let o = {
+  [prop]: 'як',
+  ['b' + 'ar']: 'справи'
+}
+ +

Опис

+ +

Ініціалізатор об'єкта - це вираз, який описує ініціалізацію {{jsxref("Object","об'єкта")}}. Об'єкт складається з властивостей, які описують цей об'єкт. Значення властивостей об'єкта можуть містити або {{Glossary("primitive","прості")}} типи даних, або інші об'єкти.

+ +

Літеральна нотація об'єкта та JSON

+ +

Літеральна нотація об'єкта - це не те саме, що запис об'єктів JavaScript (JavaScript Object Notation, JSON). Хоча вони схожі, між ними є кілька відмінностей:

+ + + +

Приклади

+ +

Створення об'єктів

+ +

Порожній об'єкт без властивостей може бути створений так:

+ +
let object = {}
+ +

Однак, перевагою літералу або ініціалізатора об'єкта є те, що ви можете швидко створити об'єкт з властивостями всередині фігурних дужок. Ви просто позначаєте список пар key: value, розділених комами.

+ +

Наступний код створює об'єкт з трьома властивостями, його ключами є "foo", "age" та "baz". Значеннями цих ключів є рядок "bar", число 42, а третя властивість має інший об'єкт в якості свого значення.

+ +
let object = {
+  foo: 'bar',
+  age: 42,
+  baz: {myProp: 12}
+}
+ +

Доступ до властивостей

+ +

Коли ви створили об'єкт, ви можете захотіти прочитати чи змінити його. До властивостей об'єкта можна звертатись, використовуючи крапкову нотацію або дужкову нотацію. Читайте Доступ до властивостей, щоб дізнатись більше.

+ +
object.foo // "bar"
+object['age'] // 42
+
+object.foo = 'baz'
+
+ +

Визначення властивостей

+ +

Ми вже дізнались, як позначати властивості за допомогою синтаксису ініціалізатора. Часто у коді є змінні, які ви б хотіли використати в об'єкті. Ви побачите код на зразок такого:

+ +
let a = 'foo',
+    b = 42,
+    c = {};
+
+let o = {
+  a: a,
+  b: b,
+  c: c
+}
+ +

У ECMAScript 2015 є коротше позначення, яке робить те саме:

+ +
let a = 'foo',
+    b = 42,
+    c = {};
+
+// Скорочений запис імен властивостей (ES2015)
+let o = {a, b, c}
+
+// Іншими словами,
+console.log((o.a === {a}.a)) // true
+
+ +

Дублювання імен властивостей

+ +

Якщо використовуються однакові імена властивостей, друга властивість перепише першу.

+ +
var a = {x: 1, x: 2};
+console.log(a); // {x: 2}
+
+ +

У строгому режимі ECMAScript 5 дублювання імен властивостей вважалося помилкою {{jsxref("SyntaxError")}}. З появою обчислюваних імен властивостей, що робило дублювання можливим під час виконання, це обмеження було прибране з ECMAScript 2015.

+ +
function haveES2015DuplicatePropertySemantics() {
+  'use strict';
+  try {
+    ({prop: 1, prop: 2});
+
+    // Помилка не викидається, дублікати дозволені у строгому режимі
+    return true;
+  } catch(e) {
+    // Помилка викидається, дублікати заборонені у строгому режимі
+    return false;
+  }
+}
+ +

Визначення методів

+ +

Властивість об'єкта може також посилатись на функцію або гетер чи сетер.

+ +
let o = {
+  property: function ([parameters]) {},
+  get property() {},
+  set property(value) {}
+}
+ +

У ECMAScript 2015 доступне скорочене позначення, тому ключове слово "function" більше не є обов'язковим.

+ +
// Скорочений запис імен методів (ES2015)
+let o = {
+  property([parameters]) {},
+}
+ +

У ECMAScript 2015 є можливість стисло визначати властивості, значеннями яких є функції-генератори:

+ +
let o = {
+  *generator() {
+    ...........
+  }
+};
+ +

Що є еквівалентним цьому позначенню в стилі ES5 (але зауважте, що у ECMAScript 5 немає генераторів):

+ +
let o = {
+  generator: function* () {
+    ...........
+  }
+}
+ +

Більше інформації та прикладів щодо методів дивіться у статті визначення методів.

+ +

Обчислювані імена властивостей

+ +

Починаючи з ECMAScript 2015, синтаксис об'єктного ініціалізатора також підтримує обчислювані імена властивостей. Це дозволяє розташувати вираз у квадратних дужках [], і він буде обчислений як ім'я властивості. Цей синтаксис є аналогічним дужковій нотації у доступі до властивостей, який ви вже могли використовувати, щоб читати та встановлювати властивості. Тепер ви можете використовувати такий самий синтаксис і для об'єктних літералів:

+ +
// Обчислювані імена властивостей (ES2015)
+let i = 0
+let a = {
+  ['foo' + ++i]: i,
+  ['foo' + ++i]: i,
+  ['foo' + ++i]: i
+}
+
+console.log(a.foo1) // 1
+console.log(a.foo2) // 2
+console.log(a.foo3) // 3
+
+let param = 'size'
+let config = {
+  [param]: 12,
+  ['mobile' + param.charAt(0).toUpperCase() + param.slice(1)]: 4
+}
+
+console.log(config) // {size: 12, mobileSize: 4}
+ +

Розкладені властивості

+ +

Пропозиція Rest/Spread Properties for ECMAScript (стадія 4) додає розкладені властивості до об'єктних літералів. Ця функціональність копіює особисті перелічувані властивості з наданого об'єкта у новий об'єкт.

+ +

Дрібне клонування (не включає prototype) чи злиття об'єктів тепер можливе з використанням синтаксису, коротшого, ніж {{jsxref("Object.assign()")}}.

+ +
let obj1 = { foo: 'bar', x: 42 }
+let obj2 = { foo: 'baz', y: 13 }
+
+let clonedObj = { ...obj1 }
+// Object { foo: "bar", x: 42 }
+
+let mergedObj = { ...obj1, ...obj2 }
+// Object { foo: "baz", x: 42, y: 13 }
+ +

Зауважте, що {{jsxref("Object.assign()")}} запускає сетери, а оператор розкладу ні!

+ +

Мутація прототипу

+ +

Визначення властивості виду __proto__: value чи "__proto__": value не створює властивість з іменем __proto__. Замість цього, якщо надане значення є об'єктом чи null, воно змінює [[Prototype]] створеного об'єкта на це значення. (Якщо значення не є об'єктом чи null, об'єкт не змінюється.)

+ +
let obj1 = {};
+assert(Object.getPrototypeOf(obj1) === Object.prototype);
+
+let obj2 = {__proto__: null};
+assert(Object.getPrototypeOf(obj2) === null);
+
+let protoObj = {};
+let obj3 = {'__proto__': protoObj};
+assert(Object.getPrototypeOf(obj3) === protoObj);
+
+let obj4 = {__proto__: 'не об\'єкт чи null'};
+assert(Object.getPrototypeOf(obj4) === Object.prototype);
+assert(!obj4.hasOwnProperty('__proto__'));
+
+ +

У об'єктному літералі дозволена лише одна мутація: декілька мутацій прототипу є синтаксичною помилкою.

+ +

Визначення властивостей, які не використовують нотацію з двокрапкою, не є мутаціями прототипу: вони є визначеннями властивостей, які поводяться ідентично до схожих визначень, що використовують будь-яке інше ім'я.

+ +
let __proto__ = 'змінна';
+
+let obj1 = {__proto__};
+assert(Object.getPrototypeOf(obj1) === Object.prototype);
+assert(obj1.hasOwnProperty('__proto__'));
+assert(obj1.__proto__ === 'змінна');
+
+let obj2 = {__proto__() { return 'привіт'; }};
+assert(obj2.__proto__() === 'привіт');
+
+let obj3 = {['__prot' + 'o__']: 17};
+assert(obj3.__proto__ === 17);
+
+ +

Специфікації

+ + + + + + + + + + +
Специфікація
{{SpecName('ESDraft', '#sec-object-initializer', 'Object Initializer')}}
+ +

Сумісність з веб-переглядачами

+ + + +

{{Compat("javascript.operators.object_initializer")}}

+ +

Див. також

+ + diff --git "a/files/uk/web/javascript/reference/operators/\320\264\320\265\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\270\320\267\320\260\321\206\321\226\321\217/index.html" "b/files/uk/web/javascript/reference/operators/\320\264\320\265\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\270\320\267\320\260\321\206\321\226\321\217/index.html" deleted file mode 100644 index 4967086ede..0000000000 --- "a/files/uk/web/javascript/reference/operators/\320\264\320\265\321\201\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\270\320\267\320\260\321\206\321\226\321\217/index.html" +++ /dev/null @@ -1,453 +0,0 @@ ---- -title: Деструктуризація -slug: Web/JavaScript/Reference/Operators/Деструктуризація -tags: - - Destructuring - - ECMAScript 2015 - - JavaScript - - Operator - - Деструктуризація - - Оператор -translation_of: Web/JavaScript/Reference/Operators/Destructuring_assignment ---- -
{{jsSidebar("Operators")}}
- -

Деструктуризація (деструктуризаційне присвоєння) - JavaScript вираз, який дозволяє витягувати дані з масивів та об’єктів в окремі змінні.

- -

Синтаксис

- -
var a, b, rest;
-[a, b] = [10, 20];
-console.log(a); // 10
-console.log(b); // 20
-
-[a, b, ...rest] = [10, 20, 30, 40, 50];
-console.log(a); // 10
-console.log(b); // 20
-console.log(rest); // [30, 40, 50]
-
-({a, b} = {a: 10, b: 20});
-console.log(a); // 10
-console.log(b); // 20
-
-// Експерементальний синтаксис (ще не стандартизований)
-({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
-
- -

Опис

- -

Вирази присвоєння літералів об’єктів та масивів надають простий спосіб створювати ad hoc (ад-гок) структури даних.

- -
var x = [1, 2, 3, 4, 5];
- -

Деструктуризаційне присвоєння використовує подібний синтаксис, де ліва сторона виразу визначає елементи, що потрібно витягнути зі змінної-джерела (правої сторони).

- -
var x = [1, 2, 3, 4, 5];
-var [y, z] = x;
-console.log(y); // 1
-console.log(z); // 2
-
- -

Це подібне до способів, що доступні у мовах програмування на кшталт Perl та Python.

- -

Деструктуризація масивів

- -

Звичайне присвоєння

- -
var foo = ['one', 'two', 'three'];
-
-var [one, two, three] = foo;
-console.log(one); // "one"
-console.log(two); // "two"
-console.log(three); // "three"
-
- -

Присвоєння, окреме від оголошення

- -

Значення може бути присвоєне змінній окремо від оголошення цієї змінної.

- -
var a, b;
-
-[a, b] = [1, 2];
-console.log(a); // 1
-console.log(b); // 2
-
- -

Значення за промовчанням

- -

Змінній може бути присвоєне значення за промовчанням у випадку, коли витягнуте значення є undefined.

- -
var a, b;
-
-[a=5, b=7] = [1];
-console.log(a); // 1
-console.log(b); // 7
-
- -

Обмін змінних

- -

Дві змінні можуть обмінятися значеннями за допомогою одного деструктуризаційного виразу. 

- -

Без деструктуризації, обмін двох значеннь потребує тимчасової змінної (або в деяких низькорівневих мовах XOR-обміну).

- -
var a = 1;
-var b = 3;
-
-[a, b] = [b, a];
-console.log(a); // 3
-console.log(b); // 1
-
- -

Розбір масиву, поверненого з функції

- -

Завжди було можливо повернути масив із функції. Деструктуризація може зробити обробку повернутого масиву більш виразною.

- -

У цьому прикладі f() повертає значення [1, 2], які можуть бути розібрані одним рядком коду за допомогою деструктуризації.

- -
function f() {
-  return [1, 2];
-}
-
-var a, b;
-[a, b] = f();
-console.log(a); // 1
-console.log(b); // 2
-
- -

Пропуск деяких значень

- -

Можна пропустити повернуті значення, які тобі не цікаві:

- -
function f() {
-  return [1, 2, 3];
-}
-
-var [a, , b] = f();
-console.log(a); // 1
-console.log(b); // 3
-
- -

Також можна пропустити всі значення (але навіщо?):

- -
[,,] = f();
-
- -

Присвоєння решти масиву змінній

- -

Деструктуризуючи масив, можна присвоїти змінній решту його елементів за допомогою оператора розпакування:

- -
var [a, ...b] = [1, 2, 3];
-console.log(a); // 1
-console.log(b); // [2, 3]
- -

Зауваж, що буде видана помилка {{jsxref("SyntaxError")}}, якщо поставити прикінцеву кому в лівій частині виразу за елементом решти:

- -
var [a, ...b,] = [1, 2, 3];
-// SyntaxError: елемент решти не може мати прикінцевої коми
- -

Витягнення значеннь з масиву збігів регулярного виразу

- -

Коли метод регулярного виразу exec() знаходить збіг, він повертає масив, що містить першим елементом повністю відповідну частину рядку, а далі частини рядку, що збіглися з кожною взятою в дужки групою в регулярному виразі. Деструктуризаційне присвоєння дозволяє з легкістю витягувати частини цього масиву, пропускаючи повний збіг, якщо він не потрібний.

- -
var url = 'https://developer.mozilla.org/en-US/Web/JavaScript';
-
-var parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
-console.log(parsedURL); // ["https://developer.mozilla.org/en-US/Web/JavaScript", "https", "developer.mozilla.org", "en-US/Web/JavaScript"]
-
-var [, protocol, fullhost, fullpath] = parsedURL;
-
-console.log(protocol); // "https"
-
- -

Деструктуризація об’єктів

- -

Звичайне присвоєння

- -
var o = {p: 42, q: true};
-var {p, q} = o;
-
-console.log(p); // 42
-console.log(q); // true
-
- -

Присвоєння, окреме від оголошення

- -

Значення може бути присвоєне змінній окремо від оголошення цієї змінної.

- -
var a, b;
-
-({a, b} = {a: 1, b: 2});
- -
-

Дужки ( .. ) навколо виразу присвоєння необхідні при деструктуризаційному присвоєні об’єкта без оголошення.

- -

Вираз {a, b} = {a: 1, b: 2} сам по собі є синтаксично неправильним, оскільки {a, b} в лівій його частині розглядається як блок коду, а не як об’єкт.

- -

Проте, ({a, b} = {a: 1, b: 2}) є правильним, як і var {a, b} = {a: 1, b: 2}

-
- -

Присвоєння новим змінним

- -

Значення може бути отримане з об’єкту та присвоєне змінній з іменем, інакшим від назви властивості об’єкта.

- -
var o = {p: 42, q: true};
-var {p: foo, q: bar} = o;
-
-console.log(foo); // 42
-console.log(bar); // true  
- -

Значення за промовчанням

- -

Змінній може бути присвоєне значення за промовчанням у випадку, коли витягнуте значення з об’єкту є undefined.

- -
var {a = 10, b = 5} = {a: 3};
-
-console.log(a); // 3
-console.log(b); // 5
- -

Встановлення значення за промовчанням аргументам функції

- -

ES5 версія

- -
function drawES5Chart(options) {
-  options = options === undefined ? {} : options;
-  var size = options.size === undefined ? 'big' : options.size;
-  var cords = options.cords === undefined ? {x: 0, y: 0} : options.cords;
-  var radius = options.radius === undefined ? 25 : options.radius;
-  console.log(size, cords, radius);
-  // тепер, врешті, малюй діаграму
-}
-
-drawES5Chart({
-  cords: {x: 18, y: 30},
-  radius: 30
-});
- -

ES2015 версія

- -
function drawES2015Chart({size = 'big', cords = {x: 0, y: 0}, radius = 25} = {}) {
-  console.log(size, cords, radius);
-  // малюй діаграму
-}
-
-drawES2015Chart({
-  cords: {x: 18, y: 30},
-  radius: 30
-});
- -

Вкладена деструктуризація об’єктів та масивів

- -
var metadata = {
-    title: 'Scratchpad',
-    translations: [
-       {
-        locale: 'de',
-        localization_tags: [],
-        last_edit: '2014-04-14T08:43:37',
-        url: '/de/docs/Tools/Scratchpad',
-        title: 'JavaScript-Umgebung'
-       }
-    ],
-    url: '/en-US/docs/Tools/Scratchpad'
-};
-
-var {title: englishTitle, translations: [{title: localeTitle}]} = metadata;
-
-console.log(englishTitle); // "Scratchpad"
-console.log(localeTitle);  // "JavaScript-Umgebung"
- -

For of цикл та деструктуризація

- -
var people = [
-  {
-    name: 'Mike Smith',
-    family: {
-      mother: 'Jane Smith',
-      father: 'Harry Smith',
-      sister: 'Samantha Smith'
-    },
-    age: 35
-  },
-  {
-    name: 'Tom Jones',
-    family: {
-      mother: 'Norah Jones',
-      father: 'Richard Jones',
-      brother: 'Howard Jones'
-    },
-    age: 25
-  }
-];
-
-for (var {name: n, family: {father: f}} of people) {
-  console.log('Name: ' + n + ', Father: ' + f);
-}
-
-// "Name: Mike Smith, Father: Harry Smith"
-// "Name: Tom Jones, Father: Richard Jones"
- -

Витягнення полів з об’єктів, що передані аргументами в функцію

- -
function userId({id}) {
-  return id;
-}
-
-function whois({displayName, fullName: {firstName: name}}) {
-  console.log(displayName + ' is ' + name);
-}
-
-var user = {
-  id: 42,
-  displayName: 'jdoe',
-  fullName: {
-      firstName: 'John',
-      lastName: 'Doe'
-  }
-};
-
-console.log('userId: ' + userId(user)); // "userId: 42"
-whois(user); // "jdoe is John"
- -

Це витягує id, displayName та firstName з об’єкта user та виводить їх.

- -

Розраховувані імена властивостей об’єкта та деструктуризація

- -

Розраховувані імена властивостей об’єкта можуть також бути використані разом із деструктуризацією

- -
let key = 'z';
-let {[key]: foo} = {z: 'bar'};
-
-console.log(foo); // "bar"
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - -
SpecificationStatusComment
{{SpecName('ES2015', '#sec-destructuring-assignment', 'Destructuring assignment')}}{{Spec2('ES2015')}}Initial definition.
{{SpecName('ESDraft', '#sec-destructuring-assignment', 'Destructuring assignment')}}{{Spec2('ESDraft')}} 
- -

Сумісність з браузерами 

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)EdgeInternet ExplorerOperaSafari
Basic support{{CompatChrome(49.0)}}{{ CompatGeckoDesktop("1.8.1") }}14{{CompatNo}}{{CompatNo}}7.1
Computed property names{{CompatChrome(49.0)}}{{ CompatGeckoDesktop("34") }}14{{CompatNo}}{{CompatNo}}{{CompatNo}}
Spread operator{{CompatChrome(49.0)}}{{ CompatGeckoDesktop("34") }}12[1]{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Basic support{{CompatNo}}{{CompatChrome(49.0)}}{{ CompatGeckoMobile("1.0") }}{{CompatNo}}{{CompatNo}}8{{CompatChrome(49.0)}}
Computed property names{{CompatNo}}{{CompatChrome(49.0)}}{{ CompatGeckoMobile("34") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatChrome(49.0)}}
Spread operator{{CompatNo}}{{CompatChrome(49.0)}}{{ CompatGeckoMobile("34") }}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatChrome(49.0)}}
-
- -

[1] Потребує ввімкнення "Enable experimental Javascript features" в налаштуваннях `about:flags`

- -

Примітки для Firefox

- - - -

Дивись також

- - diff --git "a/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200_\321\200\320\276\320\267\320\277\320\260\320\272\321\203\320\262\320\260\320\275\320\275\321\217/index.html" "b/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200_\321\200\320\276\320\267\320\277\320\260\320\272\321\203\320\262\320\260\320\275\320\275\321\217/index.html" deleted file mode 100644 index 4e635569ae..0000000000 --- "a/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200_\321\200\320\276\320\267\320\277\320\260\320\272\321\203\320\262\320\260\320\275\320\275\321\217/index.html" +++ /dev/null @@ -1,283 +0,0 @@ ---- -title: Оператор розпакування -slug: Web/JavaScript/Reference/Operators/Оператор_розпакування -tags: - - Iterator - - JavaScript - - Operator - - Ітератор - - Оператор -translation_of: Web/JavaScript/Reference/Operators/Spread_syntax -translation_of_original: Web/JavaScript/Reference/Operators/Spread_operator ---- -
{{jsSidebar("Operators")}}
- -

Оператор розпакування дозволяє розкласти колекцію в місця, де потрібні нуль чи декілька аргументів (як от виклики функцій), або декілька елементів (масиви), чи декілька змінних (деструктуризаційне присвоєння). Також можна розкласти об’єкт у місця де потрібні нуль чи більше пар ключ-значення (для оголошення об’єктів).

- -

Синтаксис

- -

Для виклику функцій:

- -
myFunction(...iterableObj);
-
- -

Для масивів:

- -
[...iterableObj, 4, 5, 6];
- -

Для об’єктів (нове в ECMAScript; чернетка в 3-ій стадії):

- -
let objClone = { ...obj };
- -

Приклади

- -

Розпакування у викликах функції

- -

Заміна apply

- -

Приклад: {{jsxref( "Function.prototype.apply")}} прийнято використовувати у випадках, коли потрібно застосувати елементи масиву як аргументи функції.

- -
function myFunction(x, y, z) { }
-var args = [0, 1, 2];
-myFunction.apply(null, args);
- -

З розпакуванням тепер отак:

- -
function myFunction(x, y, z) { }
-var args = [0, 1, 2];
-myFunction(...args);
- -

Оператор розпакування може бути застосований до будь-якого аргументу та може бути застосований кілька разів.

- -
function myFunction(v, w, x, y, z) { }
-var args = [0, 1];
-myFunction(-1, ...args, 2, ...[3]);
- -

Apply для new

- -

Викликаючи конструктор з new, неможливо напряму використовувати на ньому apply (apply робить [[Call]], а не [[Construct]]). Проте з оператором розпакування можна легко розкладати масив у аргументи конструктора:

- -
var dateFields = [1970, 0, 1]; // 1 Січ 1970
-// var d = new Date.apply(dateFields) не спрацює. Викине TypeError
-var d = new Date(...dateFields); // вуаля
- -

Розпакування в масивах

- -

Ліпше оголошення масивів

- -

Без розпакування, коли потрібно створити новий масив так, щоб якийсь існуючий був його частиною, старого синтаксису оголошення масиву не достатньо та необхідно використовувати комбінацію методів push, splice, concat, тощо. З оператором розпакування це стає значно лаконічніше:

- -
var parts = ['shoulders', 'knees'];
-var lyrics = ['head', ...parts, 'and', 'toes'];
-// ["head", "shoulders", "knees", "and", "toes"]
- -

Як і з розпакуванням списку аргументів, ... можна використовувати будь-де в оголошенні масиву та будь-яку кількість разів.

- -

Копіювання масиву

- -
var arr = [1, 2, 3];
-var arr2 = [...arr]; // так само як arr.slice()
-arr2.push(4);
-
-// arr2 стає [1, 2, 3, 4]
-// arr залишається незміненим
- -

Зауваження: оператор розпакування при копіюванні масиву йде лише на один рівень вглиб. Таким чином він не придатний для копіювання багатовимірних масивів, що видно з наступного прикладу (те саме з {{jsxref("Object.assign()")}} та розпакуванням об’єктів).

- -
var a = [[1], [2], [3]];
-var b = [...a];
-b.shift().shift(); // 1
-// Тепер масив a також змінено: [[], [2], [3]]
- -

Ліпше злиття масивів

- -

{{jsxref("Array.concat")}} часто використовується, щоб додати один масив у кінець іншого. Без розпакування це робиться так:

- -
var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-// Доддати всі елементи з arr2 в arr1
-arr1 = arr1.concat(arr2);
- -

З розпакуванням це стає:

- -
var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-arr1 = [...arr1, ...arr2];
- -

{{jsxref("Array.unshift")}} часто використовується для того, щоб вставити значення з одного масиву в початок іншого. Без розпакування це робиться так:

- -
var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-// Вставити всі елементи з arr2 в початок arr1
-Array.prototype.unshift.apply(arr1, arr2) // arr1 тепер [3, 4, 5, 0, 1, 2]
- -

З розпакуванням це стає:

- -
var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-arr1 = [...arr2, ...arr1]; // arr1 тепер [3, 4, 5, 0, 1, 2]
- -

Розпакування об’єктів

- -

Пропозиція Rest/Spread Properties for ECMAScript (стадія 3) додає розпакування до об’єктів. It copies own enumerable properties from a provided object onto a new object.

- -

Однорівневе клонування (без прототипу) чи злиття об’єктів тепер можливе використовуючи коротший запис ніж {{jsxref("Object.assign()")}}.

- -
var obj1 = { foo: 'bar', x: 42 };
-var obj2 = { foo: 'baz', y: 13 };
-
-var clonedObj = { ...obj1 };
-// Object { foo: "bar", x: 42 }
-
-var mergedObj = { ...obj1, ...obj2 };
-// Object { foo: "baz", x: 42, y: 13 }
- -

Зауваж, що {{jsxref("Object.assign()")}} викликає сетери, а оператор розпакування - ні.

- -

Лише для ітерованих

- -

Розпакування може бути застосоване лише для ітерованик об’єктів:

- -
var obj = {'key1': 'value1'};
-var array = [...obj]; // TypeError: obj is not iterable
- -

Зауваження: наразі (липень 2017) можна говорити про появу розпакування об’єктів у специфікації (дивись попередній підзаголовок). Але ще не до кінця зрозуміло як працюватиме вищенаведений приклад, адже ще немає конкретного рішення щодо цього у спецефікації. Тобто тепер ти можеш розпакувати об’єкт в об’єкт, але не зрозуміло, що станеться, якщо об’єкт розпаковувати у масив і навпаки, масив у об’єкт. Наприклад транспілятор babel вертає наступні результати:

- -
var obj = {'key1': 'value1'};
-var array = [...obj]; // запише в array пустий масив []
-
-var arr = [1,1,1];
-var obj1 = {...arr}; // запише в obj1 {'0': 1, '1': 1, '2': 1}
- -

Розпакування великих колекцій

- -

Використовуючи розпакування зважай на можливість досягнення ліміту аргументів, встановленого у JavaScript рушії, адже оператор розпакування витягує всі елементи колекції в стек, скільки б їх не було. Дивись apply() щоб дізнатись більше.

- -

Оператор решти

- -

Оператор решти виглядає точно так само як і оператор розпакування. До певної міри, він протилежний оператору розпакування - оператор розпакування розкладає колекцію на елементи, а оператор решти, натомість, складає кілька елементів у колекцію. Дивись решта параметрів.

- -

Специфікація

- - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтанКоментар
{{SpecName('ES2015', '#sec-array-initializer')}}{{Spec2('ES2015')}}Визначено в деяких секціях специфікацій: Array Initializer, Argument Lists
{{SpecName('ESDraft', '#sec-array-initializer')}}{{Spec2('ESDraft')}}Без змін.
Rest/Spread Properties for ECMAScriptЧернеткаЧернетка в 3 стадії
- -

Сумісність з браузерами

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Spread operation in array literals{{CompatChrome("46")}}{{ CompatGeckoDesktop("16") }}{{CompatIE("Edge/10240")}}{{CompatNo}}7.1
Spread operation in function calls{{CompatChrome("46")}}{{ CompatGeckoDesktop("27") }}{{CompatIE("Edge/10240")}}{{CompatNo}}7.1
Spread operation in destructuring{{CompatChrome("49")}}{{ CompatGeckoDesktop("34") }}{{CompatNo}}{{CompatUnknown}}{{CompatUnknown}}
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidAndroid WebviewFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Spread operation in array literals{{CompatNo}}{{CompatChrome("46")}}{{ CompatGeckoMobile("16") }}{{CompatNo}}{{CompatNo}}8{{CompatChrome("46")}}
Spread operation in function calls{{CompatNo}}{{CompatChrome("46")}}{{ CompatGeckoMobile("27") }}{{CompatNo}}{{CompatNo}}8{{CompatChrome("46")}}
Spread operation in destructuring{{CompatNo}}{{CompatNo}}{{ CompatGeckoDesktop("34") }}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatNo}}
-
- -

See also

- - diff --git "a/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\320\276\321\200\321\226\320\262\320\275\321\217\320\275\320\275\321\217/index.html" "b/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\320\276\321\200\321\226\320\262\320\275\321\217\320\275\320\275\321\217/index.html" deleted file mode 100644 index 9285c5dd5a..0000000000 --- "a/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\320\276\321\200\321\226\320\262\320\275\321\217\320\275\320\275\321\217/index.html" +++ /dev/null @@ -1,245 +0,0 @@ ---- -title: Оператори порівняння -slug: Web/JavaScript/Reference/Operators/Оператори_порівняння -tags: - - JavaScript - - Довідка - - Оператор -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Comparison_Operators ---- -
{{jsSidebar("Operators")}}
- -

JavaScript має як строге порівняння, так і порівняння з перетворенням типів. Строге порівняння (===) є істинним лише в тому випадку, якщо операнди мають однаковий тип, а їхній зміст співпадає. Найчастіше вживане абстрактне порівняння (==) приводить операнди до спільного типу перед виконанням порівняння. Для абстрактних порівнянь (наприклад, <=) операнди спочатку приводяться до простих типів, потім приводяться до спільного типу, а вже тоді порівнюються.

- -

Рядки порівнюються на основі стандартного лексикографічного упорядкування, використовуючи значення Unicode.

- -

{{EmbedInteractiveExample("pages/js/expressions-comparisonoperators.html")}}

- - - -

Особливості порівнянь:

- - - -

Оператори рівності

- -

Рівність (==)

- -

Оператор рівності перетворює операнди, якщо вони не однакового типу, і після цього застосовує строге порівняння. Якщо обидва операнди є об'єктами, JavaScript порівнює внутрішні посилання, які є рівними, якщо операнди посилаються на один і той самий об'єкт у пам'яті.

- -

Синтаксис

- -
x == y
-
- -

Приклади

- -
1    ==  1         // true
-'1'  ==  1         // true
-1    == '1'        // true
-0    == false      // true
-0    == null       // false
-var object1 = {'key': 'value'}, object2 = {'key': 'value'};
-object1.key == object2.key // true
-0    == undefined  // false
-null == undefined  // true
-
- -

Нерівність (!=)

- -

Оператор нерівності повертає true,  якщо операнди не є рівними. Якщо два операнда не належать до одного типу, JavaScript намагається привести операнди до відповідного типу для порівняння. Якщо обидва операнда є об'єктами, JavaScript порівнює внутрішні посилання, які є нерівними, якщо операнди посилаються на різні об'єкти у пам'яті.

- -

Синтаксис

- -
x != y
- -

Приклади

- -
1 !=   2     // true
-1 !=  '1'    // false
-1 !=  "1"    // false
-1 !=  true   // false
-0 !=  false  // false
-
- -

Ідентичність / строга рівність (===)

- -

Оператор ідентичності повертає true, якщо операнди строго рівні (див. вище) без приведення типів

- -

Синтаксис

- -
x === y
- -

Приклади

- -
3 === 3   // true
-3 === '3' // false
-var object1 = {'key': 'value'}, object2 = {'key': 'value'};
-object1 === object2 //false
- -

Неідентичність / строга нерівність (!==)

- -

Оператор неідентичності повертає true, якщо операнди не є рівними та/або не однакового типу.

- -

Синтаксис

- -
x !== y
- -

Приклади

- -
3 !== '3' // true
-4 !== 3   // true
-
- -

Оператори відношення

- -

Кожен з цих операторів буде примусово приведений до простої величини перед порівнянням. Якщо обидва перетворюються на рядки, вони порівнюються з використанням лексикографічного порядку, інакше вони будуть перетворені на числа для порівняння. Порівняння із NaN завжди поверне false.

- -

Більше ніж (>)

- -

Оператор більше ніж повертає true, якщо значення лівого операнда більше за значення правого операнда.

- -

Синтаксис

- -
x > y
- -

Приклади

- -
4 > 3 // true
-
- -

Більше чи дорівнює (>=)

- -

Оператор більше чи дорівнює повертає true, якщо значення лівого операнда більше, або дорівнює значенню правого операнда.

- -

Синтаксис

- -
 x >= y
- -

Приклади

- -
4 >= 3 // true
-3 >= 3 // true
-
- -

Менше ніж (<)

- -

Оператор менше ніж повертає true, якщо значення лівого операнда менше значення правого операнда.

- -

Синтаксис

- -
 x < y
- -

Приклади

- -
3 < 4 // true
-
- -

Менше чи дорівнює (<=)

- -

Оператор менше чи дорівнює повертає true, якщо значення лівого операнда менше або дорівнює значенню правого операнда.

- -

Синтаксис

- -
 x <= y
- -

Приклади

- -
3 <= 4 // true
-
- -

Застосування операторів порівняння

- -

Стандартні оператори рівності (== та !=) використовують алгоритм абстрактної рівності для порівняння двох операндів. Якщо операнди належать до різних типів, алгоритм спробує привести їх до спільного типу перед порівнянням; наприклад, у виразі 5 == '5', рядок праворуч буде приведений до {{jsxref("Число","числа")}} перед здійсненням порівняння.

- -

Оператори строгої рівності (=== та !==) використовують алгоритм строгої рівності та призначені для виконання перевірки рівності операндів одного типу. Якщо операнди належать до різних типів, результат завжди буде false, тому 5 !== '5'.

- -

Використовуйте оператори строгого порівняння, якщо операнди мають належати до вказаного типу, як і їх значення, або, якщо конкретний тип операндів має значення. Інакше, використовуйте стандартні оператори рівності, які дозволяють перевіряти ідентичність двох операндів, навіть якщо вони не належать до одного типу.

- -

Коли в порівнянні застосовується перетворення типів (тобто, це не строге порівняння), JavaScript перетворює типи операндів {{jsxref ("String")}}, {{jsxref ("Число","Number")}}, {{jsxref ("Boolean" )}} або {{jsxref ("Object")}} наступним чином:

- - - -
Заувага: Рядкові об'єкти є об'єктами типу Object, а не String! Об'єкти типу String використовуються рідко, а отже, наведені нижче результати можуть бути несподіваними:
- -
// true, оскільки обидва операнди мають тип String (є рядковими примітивами):
-'foo' === 'foo'
-
-var a = new String('foo');
-var b = new String('foo');
-
-// false, оскільки a та b мають тип Object і посилаються на різні об'єкти
-a == b
-
-// false, оскільки a та b мають тип Object і посилаються на різні об'єкти
-a === b
-
-// true, оскільки a та 'foo' мають різні типи, але об'єкт (а)
-// перетворюється на рядок 'foo' перед порівнянням
-a == 'foo'
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES1')}}{{Spec2('ES1')}}Початкове визначення. Реалізовано у JavaScript 1.0
{{SpecName('ES3')}}{{Spec2('ES3')}}Додані оператори === та !== . Реалізовано у JavaScript 1.3
{{SpecName('ES5.1', '#sec-11.8')}}{{Spec2('ES5.1')}}Дано визначення у декільках секціях специфікації: Оператори відношення, Оператори рівності
{{SpecName('ES6', '#sec-relational-operators')}}{{Spec2('ES6')}}Дано визначення у декільках секціях специфікації: Оператори відношення, Оператори рівності
{{SpecName('ESDraft', '#sec-relational-operators')}}{{Spec2('ESDraft')}}Дано визначення у декільках секціях специфікації: Оператори відношення, Оператори рівності
- -

Підтримка веб-переглядачами

- - - -

{{Compat("javascript.operators.comparison")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\321\200\320\270\321\201\320\262\320\276\321\224\320\275\320\275\321\217/index.html" "b/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\321\200\320\270\321\201\320\262\320\276\321\224\320\275\320\275\321\217/index.html" deleted file mode 100644 index 6c056272a1..0000000000 --- "a/files/uk/web/javascript/reference/operators/\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270_\320\277\321\200\320\270\321\201\320\262\320\276\321\224\320\275\320\275\321\217/index.html" +++ /dev/null @@ -1,419 +0,0 @@ ---- -title: Оператори присвоєння -slug: Web/JavaScript/Reference/Operators/Оператори_присвоєння -tags: - - JavaScript - - Оператор -translation_of: Web/JavaScript/Reference/Operators#Assignment_operators -translation_of_original: Web/JavaScript/Reference/Operators/Assignment_Operators ---- -
{{jsSidebar("Operators")}}
- -

Оператор присвоєння присвоює своєму лівому операнду значення, на підставі значення правого операнду.

- -

{{EmbedInteractiveExample("pages/js/expressions-assignment.html")}}

- - - -

Огляд

- -

Базовим оператором присвоєння є оператор дорівнює (=), який присвоює значення свого правого операнда лівому операнду. Таким чином, x = y присвоює змінній x значення змінної y. Інші оператори присвоєння у своїй більшості є скороченнями для стандарних операцій, як це вказано у наступній таблиці з визначеннями та прикладами.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
НазваОператор скороченого записуЗначення
Присвоєнняx = yx = y
Присвоєння з додаваннямx += yx = x + y
Присвоєння з відніманнямx -= yx = x - y
Присвоєння з множеннямx *= yx = x * y
Присвоєння з діленнямx /= yx = x / y
Присвоєння остачіx %= yx = x % y
Присвоєння з піднесенням до степеняx **= yx = x ** y
Присвоєння з лівим зсувомx <<= yx = x << y
Присвоєння з правим зсувомx >>= yx = x >> y
Присвоєння з беззнаковим правим зсувомx >>>= yx = x >>> y
Присвоєння з побітовим Іx &= yx = x & y
Присвоєння з виключним побітовим АБОx ^= yx = x ^ y
Присвоєння з побітовим АБОx |= yx = x | y
- -

Присвоєння

- -

Простий оператор присвоєння використовується для присвоєння змінній значення. Оператор присвоєння обчислює значення, що присвоюється. Можна використовувати ланцюжок присвоюваннь, щоб присвоїти одне значення декільком змінним. Дивіться приклад нижче.

- -

Синтаксис

- -
Оператор: x = y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  x = 5
-//  y = 10
-//  z = 25
-
-x = y     // x дорівнює 10
-x = y = z // x, y та z усі дорівнюють 25
-
- -

Присвоєння з додаванням

- -

Оператор присвоєння з додаванням додає значення правого операнду до змінної (лівого перанду) та записує у неї отриманий результат. Типи двох операндів визначають поведінку оператора. Таким чином, його результатом може стати або додавання або конкатенація. Для більш детального огляду дивіться {{jsxref("Operators/Arithmetic_Operators", "оператор додавання", "#Addition", 1)}}.

- -

Синтаксис

- -
Оператор:  x += y
-Значення:  x  = x + y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  foo = 'foo'
-//  bar = 5
-//  baz = true
-
-
-// число + число -> додавання
-bar += 2 // 7
-
-// булеве значення + число -> додавання
-baz += 1 // 2
-
-// булеве значення + булеве значення -> додавання
-baz += false // 1
-
-// число + рядок -> конкатенація
-bar += 'foo' // "5foo"
-
-// рядок + булеве значення -> конкатенація
-foo += false // "foofalse"
-
-// рядок + рядок -> конкатенація
-foo += 'bar' // "foobar"
-
- -

Присвоєння з відніманням

- -

Оператор присвоєння з відніманням віднімає значення правого операнду від змінної (лівого перанду) та записує у неї отриманий результат. Дивіться {{jsxref("Operators/Arithmetic_Operators", "оператор віднімання", "#Subtraction", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x -= y
-Значення:  x  = x - y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  bar = 5
-
-bar -= 2     // 3
-bar -= 'foo' // NaN
-
- -

Присвоєння з множенням

- -

Оператор присвоєння з множенням помножує змінну (лівий операнд) на значення правого операнду та записує отриманий результат у змінну. Дивіться {{jsxref("Operators/Arithmetic_Operators", "оператор множення", "#Multiplication", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x *= y
-Значення:  x  = x * y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  bar = 5
-
-bar *= 2     // 10
-bar *= 'foo' // NaN
-
- -

Присвоєння з діленням

- -

Оператор присвоєння з діленням ділить змінну (лівий операнд) на значення правого операнду та записує отриманий результат у змінну. Дивіться {{jsxref("Operators/Arithmetic_Operators", "оператор ділення", "#Division", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x /= y
-Значення:  x  = x / y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  bar = 5
-
-bar /= 2     // 2.5
-bar /= 'foo' // NaN
-bar /= 0     // Infinity
-
- -

Присвоєння остачі

- -

Оператор присвоєння остачі ділить змінну на значення правого операнду та присвоює остачу змінній. Дивіться {{jsxref("Operators/Arithmetic_Operators", "оператор остачі", "#Remainder", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x %= y
-Значення:  x  = x % y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  bar = 5
-
-bar %= 2     // 1
-bar %= 'foo' // NaN
-bar %= 0     // NaN
-
- -

Присвоєння з піднесенням до степеня

- -

Оператор присвоєння з піднесенням до степеня обчислює результат піднесення першого операнду до показника степеня другого операнду. Дивіться {{jsxref("Operators/Arithmetic_Operators", "оператор піднесення до степеня", "#Exponentiation", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x **= y
-Значення:  x  = x ** y
-
- -

Приклади

- -
// Розглянемо такі змінні:
-//  bar = 5
-
-bar **= 2     // 25
-bar **= 'foo' // NaN
- -

Присвоєння з лівим зсувом

- -

Оператор присвоєння з лівим зсувом виконує зсув першого операнду на вказану кількість бітів ліворуч та присвоює результат у змінну. Дивіться {{jsxref("Operators/Bitwise_Operators", "оператор лівого зсуву", "#Left_shift", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x <<= y
-Значення:  x   = x << y
-
- -

Приклади

- -
var bar = 5; //  (00000000000000000000000000000101)
-bar <<= 2; // 20 (00000000000000000000000000010100)
-
- -

Присвоєння з правим зсувом

- -

Оператор присвоєння з правим зсувом виконує зсув першого операнду на вказану кількість бітів праворуч та присвоює результат у змінну. Дивіться {{jsxref("Operators/Bitwise_Operators", "оператор правого зсуву", "#Right_shift", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x >>= y
-Значення:  x   = x >> y
-
- -

Приклади

- -
var bar = 5; //   (00000000000000000000000000000101)
-bar >>= 2;   // 1 (00000000000000000000000000000001)
-
-var bar -5; //    (-00000000000000000000000000000101)
-bar >>= 2;  // -2 (-00000000000000000000000000000010)
-
- -

Присвоєння з беззнаковим правим зсувом

- -

Оператор присвоєння з беззнаковим правим зсувом виконує зсув першого операнду на вказану кількість бітів праворуч та присвоює результат змінній. Дивіться {{jsxref("Operators/Bitwise_Operators", " оператор беззнакового правого зсуву", "#Unsigned_right_shift", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x >>>= y
-Значення:  x    = x >>> y
-
- -

Приклади

- -
var bar = 5; //   (00000000000000000000000000000101)
-bar >>>= 2;  // 1 (00000000000000000000000000000001)
-
-var bar = -5; // (-00000000000000000000000000000101)
-bar >>>= 2; // 1073741822 (00111111111111111111111111111110)
- -

Присвоєння з побітовим І

- -

Оператор присвоєння з побітовим І використовує двійкове представлення обох операндів, виконує над ними операцію побітового І та присвоює результат змінній. Дивіться {{jsxref("Operators/Bitwise_Operators", "оператор побітового І", "#Bitwise_AND", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x &= y
-Значення:  x  = x & y
-
- -

Приклади

- -
var bar = 5;
-// 5:     00000000000000000000000000000101
-// 2:     00000000000000000000000000000010
-bar &= 2; // 0
-
- -

Присвоєння з виключним побітовим АБО

- -

Оператор присвоєння з виключним побітовим АБО використовує двійкове представлення обох операндів, виконує над ними операцію виключного побітового АБО (XOR) та присвоює результат змінній. Дивіться {{jsxref("Operators/Bitwise_Operators", "оператор виключного побітового АБО", "#Bitwise_XOR", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x ^= y
-Значення:  x  = x ^ y
-
- -

Приклади

- -
var bar = 5;
-bar ^= 2; // 7
-// 5: 00000000000000000000000000000101
-// 2: 00000000000000000000000000000010
-// -----------------------------------
-// 7: 00000000000000000000000000000111
-
- -

Присвоєння з побітовим АБО

- -

Оператор присвоєння з побітовим АБО використовує двійкове представлення обох операндів, виконує над ними операцію побітового АБО та присвоює результат змінній. Дивіться {{jsxref("Operators/Bitwise_Operators", "оператор побітового АБО", "#Bitwise_OR", 1)}} для більш детального огляду.

- -

Синтаксис

- -
Оператор:  x |= y
-Значення:  x  = x | y
-
- -

Приклади

- -
var bar = 5;
-bar |= 2; // 7
-// 5: 00000000000000000000000000000101
-// 2: 00000000000000000000000000000010
-// -----------------------------------
-// 7: 00000000000000000000000000000111
-
- -

Приклади

- -

Лівий операнд з іншим оператором присвоєння

- -

У незвичних ситуаціях оператор присвоєння (наприклад,  x += y) не є ідентичним виразу, який він означає (в даному випадку x = x + y). Коли лівий операнд оператора присвоєння сам містить оператор присвоєння, лівий операнд обчислюється лише один раз. Наприклад:

- -
a[i++] += 5         // i обчислюється лише один раз
-a[i++] = a[i++] + 5 // i обчислюється двічі
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ESDraft', '#sec-assignment-operators', 'Assignment operators')}}{{Spec2('ESDraft')}}
{{SpecName('ES2015', '#sec-assignment-operators', 'Assignment operators')}}{{Spec2('ES2015')}}
{{SpecName('ES5.1', '#sec-11.13', 'Assignment operators')}}{{Spec2('ES5.1')}}
{{SpecName('ES1', '#sec-11.13', 'Assignment operators')}}{{Spec2('ES1')}}Початкове визначення.
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.operators.assignment")}}

- -
- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/operators/\321\226\320\275\321\226\321\206\321\226\320\260\320\273\321\226\320\267\320\260\321\206\321\226\321\217_\320\276\320\261\342\200\231\321\224\320\272\321\202\321\226\320\262/index.html" "b/files/uk/web/javascript/reference/operators/\321\226\320\275\321\226\321\206\321\226\320\260\320\273\321\226\320\267\320\260\321\206\321\226\321\217_\320\276\320\261\342\200\231\321\224\320\272\321\202\321\226\320\262/index.html" deleted file mode 100644 index 00d1497164..0000000000 --- "a/files/uk/web/javascript/reference/operators/\321\226\320\275\321\226\321\206\321\226\320\260\320\273\321\226\320\267\320\260\321\206\321\226\321\217_\320\276\320\261\342\200\231\321\224\320\272\321\202\321\226\320\262/index.html" +++ /dev/null @@ -1,296 +0,0 @@ ---- -title: Ініціалізатор об’єкта -slug: Web/JavaScript/Reference/Operators/Ініціалізація_об’єктів -tags: - - ECMAScript 2015 - - JSON - - JavaScript - - Об'єкт - - властивості - - літерал - - методи - - мутація - - обчислені -translation_of: Web/JavaScript/Reference/Operators/Object_initializer ---- -
{{JsSidebar("Operators")}}
- -

Об'єкти можна ініціалізувати через new Object()Object.create(), або за допомогою літеральної нотації (нотації ініціалізатора). Ініціалізатор об'єкта - це список з нуля або більше розділених комою пар імен властивостей та асоційованих з ними значень об'єкта, записаних у фігурних дужках ({}).

- -

{{EmbedInteractiveExample("pages/js/expressions-objectinitializer.html", "taller")}}

- - - -

Синтаксис

- -
let o = {}
-let o = {a: 'няв', b: 42, c: {}}
-
-let a = 'няв', b = 42, c = {}
-let o = {a: a, b: b, c: c}
-
-let o = {
-  property: function ([parameters]) {},
-  get property() {},
-  set property(value) {}
-};
-
- -

Нові позначення у ECMAScript 2015

- -

Будь ласка, перевірте підтримку цих позначень у таблиці сумісностей. У тих середовищах, де вони не підтримуються, вони призведуть до синтаксичних помилок.

- -
// Скорочений запис імен властивостей (ES2015)
-let a = 'привіт', b = 42, c = {};
-let o = {a, b, c}
-
-// Скорочений запис імен методів (ES2015)
-let o = {
-  property([parameters]) {}
-}
-
-// Обчислювані імена властивостей (ES2015)
-let prop = 'foo'
-let o = {
-  [prop]: 'як',
-  ['b' + 'ar']: 'справи'
-}
- -

Опис

- -

Ініціалізатор об'єкта - це вираз, який описує ініціалізацію {{jsxref("Object","об'єкта")}}. Об'єкт складається з властивостей, які описують цей об'єкт. Значення властивостей об'єкта можуть містити або {{Glossary("primitive","прості")}} типи даних, або інші об'єкти.

- -

Літеральна нотація об'єкта та JSON

- -

Літеральна нотація об'єкта - це не те саме, що запис об'єктів JavaScript (JavaScript Object Notation, JSON). Хоча вони схожі, між ними є кілька відмінностей:

- - - -

Приклади

- -

Створення об'єктів

- -

Порожній об'єкт без властивостей може бути створений так:

- -
let object = {}
- -

Однак, перевагою літералу або ініціалізатора об'єкта є те, що ви можете швидко створити об'єкт з властивостями всередині фігурних дужок. Ви просто позначаєте список пар key: value, розділених комами.

- -

Наступний код створює об'єкт з трьома властивостями, його ключами є "foo", "age" та "baz". Значеннями цих ключів є рядок "bar", число 42, а третя властивість має інший об'єкт в якості свого значення.

- -
let object = {
-  foo: 'bar',
-  age: 42,
-  baz: {myProp: 12}
-}
- -

Доступ до властивостей

- -

Коли ви створили об'єкт, ви можете захотіти прочитати чи змінити його. До властивостей об'єкта можна звертатись, використовуючи крапкову нотацію або дужкову нотацію. Читайте Доступ до властивостей, щоб дізнатись більше.

- -
object.foo // "bar"
-object['age'] // 42
-
-object.foo = 'baz'
-
- -

Визначення властивостей

- -

Ми вже дізнались, як позначати властивості за допомогою синтаксису ініціалізатора. Часто у коді є змінні, які ви б хотіли використати в об'єкті. Ви побачите код на зразок такого:

- -
let a = 'foo',
-    b = 42,
-    c = {};
-
-let o = {
-  a: a,
-  b: b,
-  c: c
-}
- -

У ECMAScript 2015 є коротше позначення, яке робить те саме:

- -
let a = 'foo',
-    b = 42,
-    c = {};
-
-// Скорочений запис імен властивостей (ES2015)
-let o = {a, b, c}
-
-// Іншими словами,
-console.log((o.a === {a}.a)) // true
-
- -

Дублювання імен властивостей

- -

Якщо використовуються однакові імена властивостей, друга властивість перепише першу.

- -
var a = {x: 1, x: 2};
-console.log(a); // {x: 2}
-
- -

У строгому режимі ECMAScript 5 дублювання імен властивостей вважалося помилкою {{jsxref("SyntaxError")}}. З появою обчислюваних імен властивостей, що робило дублювання можливим під час виконання, це обмеження було прибране з ECMAScript 2015.

- -
function haveES2015DuplicatePropertySemantics() {
-  'use strict';
-  try {
-    ({prop: 1, prop: 2});
-
-    // Помилка не викидається, дублікати дозволені у строгому режимі
-    return true;
-  } catch(e) {
-    // Помилка викидається, дублікати заборонені у строгому режимі
-    return false;
-  }
-}
- -

Визначення методів

- -

Властивість об'єкта може також посилатись на функцію або гетер чи сетер.

- -
let o = {
-  property: function ([parameters]) {},
-  get property() {},
-  set property(value) {}
-}
- -

У ECMAScript 2015 доступне скорочене позначення, тому ключове слово "function" більше не є обов'язковим.

- -
// Скорочений запис імен методів (ES2015)
-let o = {
-  property([parameters]) {},
-}
- -

У ECMAScript 2015 є можливість стисло визначати властивості, значеннями яких є функції-генератори:

- -
let o = {
-  *generator() {
-    ...........
-  }
-};
- -

Що є еквівалентним цьому позначенню в стилі ES5 (але зауважте, що у ECMAScript 5 немає генераторів):

- -
let o = {
-  generator: function* () {
-    ...........
-  }
-}
- -

Більше інформації та прикладів щодо методів дивіться у статті визначення методів.

- -

Обчислювані імена властивостей

- -

Починаючи з ECMAScript 2015, синтаксис об'єктного ініціалізатора також підтримує обчислювані імена властивостей. Це дозволяє розташувати вираз у квадратних дужках [], і він буде обчислений як ім'я властивості. Цей синтаксис є аналогічним дужковій нотації у доступі до властивостей, який ви вже могли використовувати, щоб читати та встановлювати властивості. Тепер ви можете використовувати такий самий синтаксис і для об'єктних літералів:

- -
// Обчислювані імена властивостей (ES2015)
-let i = 0
-let a = {
-  ['foo' + ++i]: i,
-  ['foo' + ++i]: i,
-  ['foo' + ++i]: i
-}
-
-console.log(a.foo1) // 1
-console.log(a.foo2) // 2
-console.log(a.foo3) // 3
-
-let param = 'size'
-let config = {
-  [param]: 12,
-  ['mobile' + param.charAt(0).toUpperCase() + param.slice(1)]: 4
-}
-
-console.log(config) // {size: 12, mobileSize: 4}
- -

Розкладені властивості

- -

Пропозиція Rest/Spread Properties for ECMAScript (стадія 4) додає розкладені властивості до об'єктних літералів. Ця функціональність копіює особисті перелічувані властивості з наданого об'єкта у новий об'єкт.

- -

Дрібне клонування (не включає prototype) чи злиття об'єктів тепер можливе з використанням синтаксису, коротшого, ніж {{jsxref("Object.assign()")}}.

- -
let obj1 = { foo: 'bar', x: 42 }
-let obj2 = { foo: 'baz', y: 13 }
-
-let clonedObj = { ...obj1 }
-// Object { foo: "bar", x: 42 }
-
-let mergedObj = { ...obj1, ...obj2 }
-// Object { foo: "baz", x: 42, y: 13 }
- -

Зауважте, що {{jsxref("Object.assign()")}} запускає сетери, а оператор розкладу ні!

- -

Мутація прототипу

- -

Визначення властивості виду __proto__: value чи "__proto__": value не створює властивість з іменем __proto__. Замість цього, якщо надане значення є об'єктом чи null, воно змінює [[Prototype]] створеного об'єкта на це значення. (Якщо значення не є об'єктом чи null, об'єкт не змінюється.)

- -
let obj1 = {};
-assert(Object.getPrototypeOf(obj1) === Object.prototype);
-
-let obj2 = {__proto__: null};
-assert(Object.getPrototypeOf(obj2) === null);
-
-let protoObj = {};
-let obj3 = {'__proto__': protoObj};
-assert(Object.getPrototypeOf(obj3) === protoObj);
-
-let obj4 = {__proto__: 'не об\'єкт чи null'};
-assert(Object.getPrototypeOf(obj4) === Object.prototype);
-assert(!obj4.hasOwnProperty('__proto__'));
-
- -

У об'єктному літералі дозволена лише одна мутація: декілька мутацій прототипу є синтаксичною помилкою.

- -

Визначення властивостей, які не використовують нотацію з двокрапкою, не є мутаціями прототипу: вони є визначеннями властивостей, які поводяться ідентично до схожих визначень, що використовують будь-яке інше ім'я.

- -
let __proto__ = 'змінна';
-
-let obj1 = {__proto__};
-assert(Object.getPrototypeOf(obj1) === Object.prototype);
-assert(obj1.hasOwnProperty('__proto__'));
-assert(obj1.__proto__ === 'змінна');
-
-let obj2 = {__proto__() { return 'привіт'; }};
-assert(obj2.__proto__() === 'привіт');
-
-let obj3 = {['__prot' + 'o__']: 17};
-assert(obj3.__proto__ === 17);
-
- -

Специфікації

- - - - - - - - - - -
Специфікація
{{SpecName('ESDraft', '#sec-object-initializer', 'Object Initializer')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.operators.object_initializer")}}

- -

Див. також

- - diff --git a/files/uk/web/javascript/reference/statements/default/index.html b/files/uk/web/javascript/reference/statements/default/index.html deleted file mode 100644 index c766150f22..0000000000 --- a/files/uk/web/javascript/reference/statements/default/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: default -slug: Web/JavaScript/Reference/Statements/default -translation_of: Web/JavaScript/Reference/Statements/switch -translation_of_original: Web/JavaScript/Reference/Statements/default ---- -
{{jsSidebar("Statements")}}
- -

Ключове слово default може використовуватись у двох ситуаціях у JavaScript: у конструкції {{jsxref("Statements/switch", "switch")}} або з оператором {{jsxref("Statements/export", "export")}}.

- -
{{EmbedInteractiveExample("pages/js/statement-default.html")}}
- - - -

Синтаксис

- -

У конструкції {{jsxref("Statements/switch", "switch")}}:

- -
switch (expression) {
-  case value1:
-    //Інструкції, що виконуються, коли значення expression дорівнює value1
-    [break;]
-  default:
-    //Інструкції, що виконуються, коли жодне значення не дорівнює значенню expression
-    [break;]
-}
- -

З оператором {{jsxref("Statements/export", "export")}}:

- -
export default nameN 
- -

Опис

- -

Більш детально дивіться на сторінках

- - - -

Приклади

- -

Використання default у конструкціях switch

- -

У наступному прикладі, якщо expr оцінюється як "Апельсини" або "Яблука", програма зайде або у блок case "Апельсини", або у "Яблука" та виконає відповідну інструкцію. Ключове слово default допоможе у будь-якому іншому випадку та виконає пов'язану інструкцію.

- -
switch (expr) {
-  case 'Апельсини':
-    console.log('Апельсини коштують $0.59 за кілограм.');
-    break;
-  case 'Яблука':
-    console.log('Яблука коштують $0.32 за кілограм.');
-    break;
-  default:
-    console.log('На жаль, в нас закінчились ' + expr + '.');
-}
- -

Використання default з export

- -

Якщо ви хочете експортувати єдине значення, або вам потрібне запасне значення модуля, можна використати default у export:

- -
// module "my-module.js"
-let cube = function cube(x) {
-  return x * x * x;
-};
-export default cube;
- -

Тоді у іншому скрипті буде прямий імпорт експорту за замовчуванням:

- -
// module "another-module.js"
-import cube from 'my-module';  //default export gave us the liberty to say import cube, instead of import cube from 'my-module'
-console.log(cube(3)); // 27
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES6', '#sec-switch-statement', 'switch statement')}}{{Spec2('ES6')}}
{{SpecName('ES6', '#sec-exports', 'Exports')}}{{Spec2('ES6')}}
{{SpecName('ESDraft', '#sec-switch-statement', 'switch statement')}}{{Spec2('ESDraft')}}
{{SpecName('ESDraft', '#sec-exports', 'Exports')}}{{Spec2('ESDraft')}}
- -

Сумісність з веб-переглядачами

- - - -

{{Compat("javascript.statements.default")}}

- -

Див. також

- - diff --git "a/files/uk/web/javascript/reference/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270_\320\277\320\265\321\200\320\265\320\261\320\276\321\200\321\203/index.html" "b/files/uk/web/javascript/reference/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270_\320\277\320\265\321\200\320\265\320\261\320\276\321\200\321\203/index.html" deleted file mode 100644 index d5899043ca..0000000000 --- "a/files/uk/web/javascript/reference/\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273\320\270_\320\277\320\265\321\200\320\265\320\261\320\276\321\200\321\203/index.html" +++ /dev/null @@ -1,352 +0,0 @@ ---- -title: Протоколи перебору -slug: Web/JavaScript/Reference/Протоколи_перебору -tags: - - ECMAScript 2015 - - JavaScript - - Ітератор - - ітерабельний об'єкт -translation_of: Web/JavaScript/Reference/Iteration_protocols ---- -
{{jsSidebar("More")}}
- -

Пара доповнень до ECMAScript 2015 є не новими вбудованими елементами чи синтаксисом, а протоколами. Ці протоколи можуть реалізовуватись будь-яким об'єктом, що відповідає певним правилам.

- -

Існують два протоколи: протокол ітерабельного об'єкта і протокол ітератора.

- -

Протокол ітерабельного об'єкта

- -

Протокол ітерабельного об'єкта дозволяє об'єктам JavaScript визначати чи налаштовувати свою ітераційну поведінку, наприклад, через які значення буде проходити цикл у конструкції {{jsxref("Statements/for...of", "for..of")}}. Деякі вбудовані типи є вбудованими ітерабельними об'єктами з визначеною за замовчуванням ітераційною поведінкою, наприклад, {{jsxref("Array")}} або {{jsxref("Map")}}, в той час, як інші типи (такі, як {{jsxref("Object")}}) не є ітерабельними.

- -

Для того, щоб бути ітерабельним, об'єкт має реалізувати метод @@iterator, тобто, цей об'єкт (або один з об'єктів у його ланцюжку прототипів) повинен мати властивість з ключем @@iterator, доступну через константу {{jsxref("Symbol.iterator")}}:

- - - - - - - - - - - - - - -
ВластивістьЗначення
[Symbol.iterator]Функція без аргументів, яка повертає об'єкт, що відповідає протоколу ітератора.
- -

Коли виникає необхідність перебрати об'єкт (наприклад, на початку циклу for..of), його метод @@iterator викликається без аргументів, а ітератор, який він повертає, використовується для отримання значень, що перебираються.

- -

Протокол ітератора

- -

Протокол ітератора визначає стандартний спосіб створювати послідовності значень (скінченні або нескінченні).

- -

Об'єкт є ітератором, коли реалізує метод next() з наступною семантикою:

- - - - - - - - - - - - -
ВластивістьЗначення
next -

Функція з нулем аргументів, яка повертає об'єкт з двома властивостями:

- -
    -
  • done (булеве значення) - -
      -
    • Має значення true, якщо ітератор досяг кінця послідовності, що перебирається. В цьому випадку value може містити значення, що повертається ітератором. Значення, що повертаються, пояснюються тут.
    • -
    • Має значення false, якщо ітератор був здатний надати наступне значення послідовності. Це аналогічно тому, щоб взагалі не вказувати значення властивості done.
    • -
    -
  • -
  • value - будь-яке значення JavaScript, що повертає ітератор. Його можна не вказувати, коли done дорівнює true.
  • -
- -

Метод next завжди повинен повертати об'єкт з належними властивостями, в тому числі done та value. Якщо повертається значення, що не є об'єктом (наприклад, false чи undefined), буде викинуто помилку {{jsxref("TypeError")}} ("iterator.next() returned a non-object value").

-
- -
-

Неможливо знати, чи певний об'єкт реалізує протокол ітератора, однак, можна легко створити об'єкт, який відповідає обом протоколам, ітератора та ітерабельного об'єкта (як показано нижче у прикладі). Це дозволяє використовувати ітератор там, де очікується ітерабельний об'єкт. Тому нечасто є потреба реалізовувати протокол ітератора, не реалізуючи також протокол ітерабельного об'єкта. 

- -
var myIterator = {
-    next: function() {
-        // ...
-    },
-    [Symbol.iterator]: function() { return this }
-};
-
-
- -

Приклади застосування протоколів перебору

- -

Об'єкт {{jsxref("String")}} є прикладом вбудованого ітерабельного об'єкта:

- -
var someString = '13';
-typeof someString[Symbol.iterator];          // "function"
-
- -

Вбудований ітератор об'єкта String повертає коди символів рядка один за одним:

- -
var iterator = someString[Symbol.iterator]();
-iterator + '';                               // "[object String Iterator]"
-
-iterator.next();                             // { value: "1", done: false }
-iterator.next();                             // { value: "3", done: false }
-iterator.next();                             // { value: undefined, done: true }
- -

Деякі вбудовані конструкції, такі як оператор розпакування, використовують під капотом той самий протокол перебору:

- -
[...someString]                              // ["1", "3"]
- -

Ми можемо перевизначити поведінку під час перебору, надавши свій власний метод @@iterator:

- -
var someString = new String('привіт');   // необхідно явно конструювати об'єкт String, щоб запобігти автопакуванню
-
-someString[Symbol.iterator] = function() {
-  return { // це ітератор, що повертає єдиний елемент, рядок "бувай"
-    next: function() {
-      if (this._first) {
-        this._first = false;
-        return { value: 'бувай', done: false };
-      } else {
-        return { done: true };
-      }
-    },
-    _first: true
-  };
-};
-
- -

Зверніть увагу, як перевизначення методу @@iterator впливає на поведінку вбудованих конструкцій, що використовують протокол перебору:

- -
[...someString];                             // ["бувай"]
-someString + '';                             // "привіт"
-
- -

Приклади ітерабельних об'єктів

- -

Вбудовані ітерабельні об'єкти

- -

{{jsxref("String")}}, {{jsxref("Array")}}, {{jsxref("TypedArray")}}, {{jsxref("Map")}} та {{jsxref("Set")}} всі є вбудованими ітерабельними об'єктами, тому що кожний з їхніх прототипів реалізує метод @@iterator.

- -

Створені користувачем ітерабельні об'єкти

- -

Ми можемо створювати власні ітерабельні об'єкти наступним чином:

- -
var myIterable = {};
-myIterable[Symbol.iterator] = function* () {
-    yield 1;
-    yield 2;
-    yield 3;
-};
-[...myIterable]; // [1, 2, 3]
-
- -

Вбудовані API, що приймають ітерабельні об'єкти

- -

Існує багато API, які приймають ітерабельні об'єкти, наприклад: {{jsxref("Map", "Map([iterable])")}}, {{jsxref("WeakMap", "WeakMap([iterable])")}}, {{jsxref("Set", "Set([iterable])")}} and {{jsxref("WeakSet", "WeakSet([iterable])")}}:

- -
var myObj = {};
-new Map([[1, 'а'], [2, 'б'], [3, 'в']]).get(2);               // "б"
-new WeakMap([[{}, 'а'], [myObj, 'б'], [{}, 'в']]).get(myObj); // "б"
-new Set([1, 2, 3]).has(3);                               // true
-new Set('123').has('2');                                 // true
-new WeakSet(function* () {
-    yield {};
-    yield myObj;
-    yield {};
-}()).has(myObj);                                         // true
-
- -

Дивіться також {{jsxref("Promise.all", "Promise.all(iterable)")}}, {{jsxref("Promise.race", "Promise.race(iterable)")}} та {{jsxref("Array.from", "Array.from()")}}.

- -

Синтаксис, що очікує на ітерабельний об'єкт

- -

Деякі оператори та вирази очікують на ітерабельні об'єкти, наприклад, цикли for-of, оператор розпакування, yield* та деструктуризаційне присвоєння:

- -
for(let value of ['а', 'б', 'в']){
-    console.log(value);
-}
-// "а"
-// "б"
-// "в"
-
-[...'абв']; // ["а", "б", "в"]
-
-function* gen() {
-  yield* ['а', 'б', 'в'];
-}
-
-gen().next(); // { value:"а", done:false }
-
-[a, b, c] = new Set(['а', 'б', 'в']);
-a // "а"
-
-
- -

Погано сформовані ітерабельні об'єкти

- -

Якщо метод ітерабельного об'єкта @@iterator не повертає об'єкт ітератора, то це погано сформований ітерабельний об'єкт. Використання його в такому вигляді ймовірно призведе до викидання винятків під час виконання або помилкової поведінки:

- -
var nonWellFormedIterable = {}
-nonWellFormedIterable[Symbol.iterator] = () => 1
-[...nonWellFormedIterable] // TypeError: [] is not a function
-
- -

Приклади ітераторів

- -

Простий ітератор

- -
function makeIterator(array) {
-    var nextIndex = 0;
-
-    return {
-       next: function() {
-           return nextIndex < array.length ?
-               {value: array[nextIndex++], done: false} :
-               {done: true};
-       }
-    };
-}
-
-var it = makeIterator(['yo', 'ya']);
-
-console.log(it.next().value); // 'yo'
-console.log(it.next().value); // 'ya'
-console.log(it.next().done);  // true
-
- -

Нескінченний ітератор

- -
function idMaker() {
-    var index = 0;
-
-    return {
-       next: function(){
-           return {value: index++, done: false};
-       }
-    };
-}
-
-var it = idMaker();
-
-console.log(it.next().value); // '0'
-console.log(it.next().value); // '1'
-console.log(it.next().value); // '2'
-// ...
-
- -

З генератором

- -
function* makeSimpleGenerator(array) {
-    var nextIndex = 0;
-
-    while (nextIndex < array.length) {
-        yield array[nextIndex++];
-    }
-}
-
-var gen = makeSimpleGenerator(['yo', 'ya']);
-
-console.log(gen.next().value); // 'yo'
-console.log(gen.next().value); // 'ya'
-console.log(gen.next().done);  // true
-
-
-
-function* idMaker() {
-    var index = 0;
-    while (true)
-        yield index++;
-}
-
-var gen = idMaker();
-
-console.log(gen.next().value); // '0'
-console.log(gen.next().value); // '1'
-console.log(gen.next().value); // '2'
-// ...
-
- -

З класом ES2015

- -
class SimpleClass {
-  constructor(data) {
-    this.index = 0;
-    this.data = data;
-  }
-
-  [Symbol.iterator]() {
-    return {
-      next: () => {
-        if (this.index < this.data.length) {
-          return {value: this.data[this.index++], done: false};
-        } else {
-          this.index = 0; //Якщо ми хотіли б перебрати його знову, без примусового ручного оновлення індексу
-          return {done: true};
-        }
-      }
-    }
-  };
-}
-
-const simple = new SimpleClass([1,2,3,4,5]);
-
-for (const val of simple) {
-  console.log(val);  //'0' '1' '2' '3' '4' '5'
-}
-
- -

Генератор є ітератором чи ітерабельним об'єктом?

- -

Об'єкт генератор є одночасно ітератором та ітерабельним об'єктом:

- -
var aGeneratorObject = function* () {
-    yield 1;
-    yield 2;
-    yield 3;
-}();
-typeof aGeneratorObject.next;
-// "function", бо він має метод next, отже, він ітератор
-typeof aGeneratorObject[Symbol.iterator];
-// "function", бо він має метод @@iterator, отже, він ітерабельний об'єкт
-aGeneratorObject[Symbol.iterator]() === aGeneratorObject;
-// true, бо його метод @@iterator повертає себе (ітератор),
-// отже, він добре сформований ітерабельний об'єкт
-[...aGeneratorObject];
-// [1, 2, 3]
-
- -

Специфікації

- - - - - - - - - - - - - - - - - - - -
СпецифікаціяСтатусКоментар
{{SpecName('ES2015', '#sec-iteration', 'Iteration')}}{{Spec2('ES2015')}}Початкова виознака.
{{SpecName('ESDraft', '#sec-iteration', 'Iteration')}}{{Spec2('ESDraft')}}
- -

Див. також

- - diff --git "a/files/uk/web/javascript/\320\277\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\275\320\260_\321\200\321\226\320\262\320\275\321\226\321\201\321\202\321\214_\321\202\320\260_\320\276\320\264\320\275\320\260\320\272\320\276\320\262\321\226\321\201\321\202\321\214/index.html" "b/files/uk/web/javascript/\320\277\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\275\320\260_\321\200\321\226\320\262\320\275\321\226\321\201\321\202\321\214_\321\202\320\260_\320\276\320\264\320\275\320\260\320\272\320\276\320\262\321\226\321\201\321\202\321\214/index.html" deleted file mode 100644 index 45d16489a1..0000000000 --- "a/files/uk/web/javascript/\320\277\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\275\320\260_\321\200\321\226\320\262\320\275\321\226\321\201\321\202\321\214_\321\202\320\260_\320\276\320\264\320\275\320\260\320\272\320\276\320\262\321\226\321\201\321\202\321\214/index.html" +++ /dev/null @@ -1,494 +0,0 @@ ---- -title: Перевірка на рівність та однаковість -slug: Web/JavaScript/Перевірка_на_рівність_та_однаковість -tags: - - JavaScript - - NaN - - SameValue - - SameValueZero - - Однаковість - - Рівність - - Тотожність - - порівняння -translation_of: Web/JavaScript/Equality_comparisons_and_sameness ---- -
{{jsSidebar("Intermediate")}}
- -

У ES2015 існує чотири алгоритми рівності:

- - - -

JavaScript надає три різні операції порівняння значень:

- - - -

Вибір оператора залежитиме від того, який різновид порівняння вам потрібен. Коротко:

- - - -

Зауважте, що усі відмінності операторів стосуються їхнього поводження з простими величинами; жоден з них не порівнює, чи є параметри концептуально однаковими за структурою. Для будь-яких не примітивних об'єктів x та y, що мають однакову структуру, але є двома окремими об'єктами, всі вищенаведені форми порівняння вертатимуть false.

- -

Строга рівність за допомогою ===

- -

Строга рівність перевіряє рівність двох значень. До жодного з них не застосовується неявне приведення перед порівнянням. Якщо значення мають різні типи, вони вважаються нерівними. Якщо значення мають однаковий тип, не є числами, і мають однакові значення, вони вважаються рівними. Нарешті, якщо обидва значення є числами, вони вважаються рівними, якщо обидва не дорівнюють NaN та мають однакові значення, або якщо одне дорівнює +0, а інше -0.

- -
var num = 0;
-var obj = new String('0');
-var str = '0';
-
-console.log(num === num); // true
-console.log(obj === obj); // true
-console.log(str === str); // true
-
-console.log(num === obj); // false
-console.log(num === str); // false
-console.log(obj === str); // false
-console.log(null === undefined); // false
-console.log(obj === null); // false
-console.log(obj === undefined); // false
-
- -

Строга рівність майже завжди є доречною операцією порівняння. Для усіх значень, крім чисел, вона використовує очевидну семантику: значення дорівнює лише самому собі. Для чисел вона використовує трохи відмінну семантику, щоб згладити два граничні випадки. Перший полягає в тому, що нуль з рухомою комою є або додатним, або від'ємним. Це корисно для представлення деяких математичних рішень, але, оскільки у більшості ситуацій різниця між +0 та -0 не має значення, строга рівність вважає їх одним значенням. Другий випадок полягає в тому, що рухома кома містить концепцію не числа, NaN (not a number), для вирішення деяких нечітко визначених математичних проблем: наприклад, від'ємна нескінченність, додана до позитивної нескінченності. Строга рівність вважає значення NaN нерівним будь-якій іншій величині, в тому числі самому собі. (Єдиний випадок, у якому (x !== x) дорівнює true, це коли x дорівнює NaN.)

- -

Нестрога рівність за допомогою ==

- -

Нестрога рівність порівнює два значення після приведення обох значень до спільного типу. Після приведення (один чи обидва значення можуть зазнати перетворення), фінальне порівняння виконується так само, як його виконує оператор ===. Нестрога рівність є симетричною: вираз A == B за семантикою завжди ідентичний B == A для будь-яких значень A та B (за винятком порядку, в якому виконуються перетворення).

- -

Порівняльна операція виконується наступним чином для операндів різних типів:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Операнд B
UndefinedNullNumberStringBooleanObject
Операнд AUndefinedtruetruefalsefalsefalsefalse
Nulltruetruefalsefalsefalsefalse
NumberfalsefalseA === BA === ToNumber(B)A === ToNumber(B)A == ToPrimitive(B)
StringfalsefalseToNumber(A) === BA === BToNumber(A) === ToNumber(B)A == ToPrimitive(B)
BooleanfalsefalseToNumber(A) === BToNumber(A) === ToNumber(B)A === BToNumber(A) == ToPrimitive(B)
ObjectfalsefalseToPrimitive(A) == BToPrimitive(A) == BToPrimitive(A) == ToNumber(B)A === B
- -

У наведеній вище таблиці ToNumber(A) пробує перетворити свій аргумент на число перед порівнянням. Його поведінка еквівалентна операції +A (унарний оператор +). ToPrimitive(A) пробує перетворити свій аргумент-об'єкт на просту величину, викликаючи в різній послідовності методи A.toString та A.valueOf на операнді A.

- -

Традиційно, та згідно з ECMAScript, усі об'єкти нестрого нерівні undefined та null. Але більшість переглядачів дозволяють дуже вузькому класу об'єктів (зокрема, об'єкту document.all на будь-якій сторінці) у певному контексті поводитись, як наче вони емулюють значення undefined. Нестрога рівність у такому контексті: null == A та undefined == A оцінить як true тільки за умови, що A є об'єктом, який емулює undefined. У всіх інших випадках об'єкт ніколи не є нестрого рівним undefined або null.

- -
var num = 0;
-var obj = new String('0');
-var str = '0';
-
-console.log(num == num); // true
-console.log(obj == obj); // true
-console.log(str == str); // true
-
-console.log(num == obj); // true
-console.log(num == str); // true
-console.log(obj == str); // true
-console.log(null == undefined); // true
-
-// обидва дорівнюють false, крім виняткових випадків
-console.log(obj == null);
-console.log(obj == undefined);
-
- -

Деякі розробники вважають, що краще ніколи не використовувати нестрогу рівність. Результат порівняння за допомогою строгої рівності легше передбачити, а, оскільки жодного приведення типів не виконується, обчислення може відбуватись швидше.

- -

Порівняння за алгоритмом same-value

- -

Порівняння same-value (однакове значення) спрямоване на останній випадок використання: визначення того, чи є два значення функціонально ідентичними в усіх контекстах. (Цей випадок використання демонструє приклад принципу підстановки Лісков.) Один приклад виникає, коли робиться спроба змінити незмінну властивість:

- -
// Додати незмінну властивість NEGATIVE_ZERO у конструктор Number.
-Object.defineProperty(Number, 'NEGATIVE_ZERO',
-                      { value: -0, writable: false, configurable: false, enumerable: false });
-
-function attemptMutation(v) {
-  Object.defineProperty(Number, 'NEGATIVE_ZERO', { value: v });
-}
-
- -

Object.defineProperty викине виняток, коли спроба змінити незмінну властивість дійсно змінить її, але нічого не зробить, якщо не робиться запитів на реальну зміну. Якщо v дорівнює -0, запитів на зміну не виконувалось, жодна помилка не буде викинута. Внутрішньо, коли перевизначається незмінна властивість, нове значення порівнюється з наявним значенням за допомогою алгоритму same-value.

- -

Алгоритм same-value надається методом {{jsxref("Object.is")}}.

- -

Порівняння за алгоритмом same-value-zero

- -

Схожий на алгоритм same-value, але вважає +0 та -0 рівними.

- -

Абстрактна рівність, строга рівність та однакове значення у специфікації

- -

У ES5 порівняння, що виконується за допомогою ==, описане у Розділі 11.9.3, Алгоритм абстрактної рівності. Порівняння === у 11.9.6, Алгоритм строгої рівності. (Сходіть почитайте. Вони короткі та легкі для читання. Підказка: читайте спочатку алгоритм строгої рівності.) ES5 також описує, у Розділі 9.12, Алгоритм SameValue, для внутрішнього використання рушієм JS. Він значною мірою такий самий, як алгоритм строгої рівності, за винятком того, як 11.9.6.4 та 9.12.4 відрізняються у поводженні з {{jsxref("Number","числами")}}. ES2015 просто відкриває цей алгоритм через {{jsxref("Object.is")}}.

- -

Щодо подвійного та потрійного дорівнює, можна побачити, що, за винятком попередньої перевірки типу у 11.9.6.1, алгоритм строгої рівності є підмножиною алгоритму абстрактної рівності, бо 11.9.6.2–7 відповідають 11.9.3.1.a–f.

- -

Модель для розуміння порівняльних алгоритмів?

- -

До ES2015 ви, можливо, сказали б щодо подвійного та потрійного дорівнює, що один є "посиленою" версією іншого. Наприклад, хтось може сказати, що подвійне дорівнює є посиленою версією потрійного дорвінює, тому що перше робить усе, що робить друге, але з приведенням типів у операндах. Наприклад, 6 == "6". (Альтернативно, хтось може сказати, що подвійне дорівнює є основою, а потрійне дорівнює є посиленою версією, тому що воно вимагає, щоб два операнди були однакового типу, і таким чином, вводить додаткове обмеження. Яка модель краща для розуміння, залежить від того, яким чином ви розглядаєте питання.)

- -

Однак, така модель вбудованих операторів однаковості не може бути поширена на ES2015 з включенням у свій "діапазон" методу {{jsxref("Object.is")}}. Метод {{jsxref("Object.is")}} не просто "абстрактніший", ніж подвійне, або "суворіший", ніж потрійне дорівнює, він також не вписується десь посередині (тобто, будучи одночасно суворішим за подвійне дорівнює, але менш строгим за потрійне дорівнює). Як можна побачити з наведеної нижче порівняльної таблиці, все через поводження {{jsxref("Object.is")}} з {{jsxref("NaN")}}. Зверніть увагу, що, якби значення Object.is(NaN, NaN) дорівнювало false, ми могли б сказати, що метод вписується у абстрактно-суворий діапазон як ще суворіший за потрійне дорівнює, такий, що розрізняє -0 та +0. Однак, його поводження з {{jsxref("NaN")}} означає, що це не так. На жаль, {{jsxref("Object.is")}} просто має сприйматись з точки зору його особливих характеристик, а не його абстрактності чи суворості у порівнянні з операторами рівності.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Порівняльні алгоритми
xy=====Object.isSameValueZero
undefinedundefinedtruetruetruetrue
nullnulltruetruetruetrue
truetruetruetruetruetrue
falsefalsetruetruetruetrue
'foo''foo'truetruetruetrue
00truetruetruetrue
+0-0truetruefalsetrue
+00truetruetruetrue
-00truetruefalsetrue
0falsetruefalsefalsefalse
""falsetruefalsefalsefalse
""0truefalsefalsefalse
'0'0truefalsefalsefalse
'17'17truefalsefalsefalse
[1, 2]'1,2'truefalsefalsefalse
new String('foo')'foo'truefalsefalsefalse
nullundefinedtruefalsefalsefalse
nullfalsefalsefalsefalsefalse
undefinedfalsefalsefalsefalsefalse
{ foo: 'bar' }{ foo: 'bar' }falsefalsefalsefalse
new String('foo')new String('foo')falsefalsefalsefalse
0nullfalsefalsefalsefalse
0NaNfalsefalsefalsefalse
'foo'NaNfalsefalsefalsefalse
NaNNaNfalsefalsetruetrue
- -

Коли використовувати {{jsxref("Object.is")}} та потрійне дорівнює

- -

Загалом, єдиний випадок, коли особлива поведінка {{jsxref("Object.is")}} щодо нулів може становити інтерес, це впровадження певних схем метапрограмування, особливо тих, що стосуються дескрипторів властивостей, коли бажано, щоб ваша робота відображала певні характеристики {{jsxref("Object.defineProperty")}}. Якщо ваш випадок цього не вимагає, пропонується уникати {{jsxref("Object.is")}} та використовувати натомість ===. Навіть якщо у вашому випадку вимагається, щоб порівняння двох {{jsxref("NaN")}} повертало true, загалом, легше перевіряти {{jsxref("NaN")}} окремо (за допомогою методу {{jsxref("isNaN")}}, доступного у попередніх версіях ECMAScript), ніж розбиратися, як навколишні обчислення можуть вплинути на знаки нулів, які зустрінуться вам у порівняннях.

- -

Ось невичерпний список вбудованих методів та операцій, що можуть спричинити відмінності між -0 та +0, які можуть проявити себе у коді:

- -
-
- (унарний мінус)
-
- -
-
-
let stoppingForce = obj.mass * -obj.velocity;
- -

Якщо obj.velocity дорівнює 0 (або обчислюється як 0), в цьому місці отримуємо -0, який переходить далі у stoppingForce.

-
-
- -
-
{{jsxref("Math.atan2")}}
-
{{jsxref("Math.ceil")}}
-
{{jsxref("Math.pow")}}
-
{{jsxref("Math.заокругелння","Math.round")}}
-
- -
-
У деяких випадках -0 може потрапити у вираз як результат одного з цих методів, навіть коли жоден параметр не дорівнює -0. Наприклад, при використанні {{jsxref("Math.pow")}} для піднесення {{jsxref("Infinity", "-Infinity")}} до будь-якого від'ємного непарного степеня, отримуємо -0. Звертайтесь до документації щодо окремих методів.
-
- -
-
{{jsxref("Math.floor")}}
-
{{jsxref("Math.max")}}
-
{{jsxref("Math.min")}}
-
{{jsxref("Math.sin")}}
-
{{jsxref("Math.sqrt")}}
-
{{jsxref("Math.tan")}}
-
- -
-
Можливо отримати -0 як результат виконання даних методів у певних випадках, коли -0 присутній як один з параметрів. Наприклад, Math.min(-0, +0) повертає -0. Звертайтесь до документації щодо окремих методів.
-
- -
-
~
-
<<
-
>>
-
Кожний з цих операторів внутрішньо використовує алгоритм ToInt32. Оскільки існує лише одне представлення 0 у внутрішньому 32-бітному цілочисельному типі, -0 не збережеться після подвійної операції інверсії. Наприклад, і Object.is(~~(-0), -0), і Object.is(-0 << 2 >> 2, -0) повернуть false.
-
- -

Покладатися на метод {{jsxref("Object.is")}}, не беручи до уваги знаки нулів, може бути небезпечно. Звісно, якщо на меті стоїть розрізнити -0 та +0, він робить саме те, що потрібно.

- -

Попередження: {{jsxref("Object.is")}} та NaN

- -

Специфікація {{jsxref("Object.is")}} вважає усі екземпляри {{jsxref("NaN")}} тим самим об'єктом, але, оскільки нам доступні типізовані масиви, ми можемо мати окремі екземпляри, які не поводитимуться ідентично в усіх контекстах. Приклад:

- -
var f2b = x => new Uint8Array(new Float64Array([x]).buffer);
-var b2f = x => new Float64Array(x.buffer)[0];
-var n = f2b(NaN);
-n[0] = 1;
-var nan2 = b2f(n);
-nan2
-> NaN
-Object.is(nan2, NaN)
-> true
-f2b(NaN)
-> Uint8Array(8) [0, 0, 0, 0, 0, 0, 248,127)
-f2b(nan2)
-> Uint8Array(8) [1, 0, 0, 0, 0, 0, 248,127)
- -

Див. також

- - -- cgit v1.2.3-54-g00ecf