We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.

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

Строки порівнюються на основі стандартного лексикографічного упорядкування, використовуючи значення Unicode.

Особливості порівняння:

  • Дві строки строго рівні, якщо мають однакову послідовність символів, однакову довжину та однакові символи у відповідних(однакових) позиціях.
  • Два числа строго рівні, якщо їхні значення рівні (мають однакове числове значення). NaN не дорівнює і не є рівним нічому, включаючи NaN. Додатні та від'ємні нулі дорівнюють один одному.
  • Два логічні операнда строго рівні, якщо обидва єtrue, або обидва є false.
  • Два різні (найймовірніше автор має на увазі об'єкти різних типів) об'єкти ніколи не є рівними ні при строгому, ні при абстрактному порівнянні.
  • Вираз, який порівнює об'єкти, справедливий лише тоді, коли операнди посилаються на один і той же об'єкт.
  • Null та Undefined типи строго рівні самі собі та абстрактно рівні один одному.

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

Equality (==)

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

Синтаксис

x == y

Приклади

1    ==  1         // true
'1'  ==  1         // true
1    == '1'        // true
0    == false      // true
0    == null       // false
var object1 = {'value': 'key'}, object2 = {'value': 'key'}; 
object1 == object2 //false
0    == undefined  // false
null == undefined  // true

Inequality (!=)

Оператор нерівності повертає true,  якщо операнди не є рівними. Якщо два операнда не є операндами однакового типу, JavaScript намагається конвертувати операнди в відповідний тип для порівняння. Якщо обидва операнда - об'єкти, JavaScript порівнює внутрішні посилання і вони є нерівними в тому випадку, якщо операнди посилаються на різні об'єкти в пам'яті.

Синтаксис

x != y

Приклади

1 !=   2     // true
1 !=  '1'    // false
1 !=  "1"    // false
1 !=  true   // false
0 !=  false  // false

Identity / strict equality (===)

Оператор ідентичності повертає true, якщо операнди строго рівні (див. вище) без застосування конвертації типів

Синтаксис

x === y

Приклади

3 === 3   // true
3 === '3' // false
var object1 = {'value': 'key'}, object2 = {'value': 'key'};
object1 === object2 //false

 

Non-identity / strict inequality (!==)

Оператор неідентичності повертає true, якщо операнди не є рівними та/або не однакового типу.

Синтаксис

x !== y

Приклади

3 !== '3' // true
4 !== 3   // true

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

Кожен з цих операторів перед порівнянням викличе функцію valueOf() до кожного операнда.

Greater than operator (>)

Оператор більше повертає true, якщо значення лівого операнда більше за значення правого операнда.

Синтаксис

x > y

Приклади

4 > 3 // true

Greater than or equal operator (>=)

Оператор більше-дорівнює повертає true, якщо значення лівого операнда більше, або дорівнює значенню правого операнда.

Синтаксис

 x >= y

Приклади

4 >= 3 // true
3 >= 3 // true

Less than operator (<)

Оператор менше повертає true, якщо значення лівого операнда менше значення правого операнда.

Синтаксис

 x < y

Приклади

3 < 4 // true

Less than or equal operator (<=)

Оператор менше-дорівнює повертає true, якщо значення лівого операнда менше, або дорівнює значенню правого операнда.

Синтаксис

 x <= y

Приклади

3 <= 4 // true

Застосування операторів порівняння

Оператори стандартної рівності (== and !=) використовують Abstract Equality Comparison Algorithm (алгоритм порівняння абстрактної рівності) для порівняння двох операндів. Якщо операнди рівзних типів, він (алгоритм) спробує конвертувати їх до спільного типу перед проведенням самого порівняння; наприклад, у виразі 5 == '5', строка праворуч буде зконвертована до Number перед здійсненням порівняння.

Оператори строгої рівності (ідентичності) (=== and !==) використовують Strict Equality Comparison Algorithm (алгоритм порівняння строгої рівності) і призначені для виконання порівняння рівності в операндах одного і того ж типу. Якщо операнди різних типів, результат завжди є false, тому 5 !== '5'.

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

Коли в порівнянні застосовується конвертація типів (тобто, не строгого порівняння), JavaScript перетворює типи String, Number, Boolean або Object операндів наступним чином:

  • Порівнюючи число і строку, строка конвертується в числове значення. JavaScript намагається конвертувати числовий літерал строки (цифру в тексті "4")  в значення типу Number. Спочатку, математичне значення виводиться з числового літерала строки. Далі ця величина округлюється до найближчого значення типу Number.
  • Якщо один з операндів Boolean, логічний операнд конвертується в 1, якщо він true (істинний), або в +0, якщо false (хибний).
  • Якщо об'єкт порівнюється з строкою або числом, JavaScript намагається повернути значення об'єкта за замовчуванням (дефолтне значення). Оператори намагаються конвертувати об'єкти в просте значення , String (строку) чи Number (число), використовуючи valueOf та toString методи до об'єкта. Якщо спроба конвертації була невдалою, генерується помилка виконання.
  • Зауважте, що об'єкт конвертується в простий тоді, і тільки тоді, коли об'єкт з яким він порівнюється є простим. Якщо обидва операнда є об'єктами, вони порівнюються як об'єкти, а тест на рівність істинний, тільки якщо обидва посилаються на один і той же об'єкт.
Зверніть увагу: строкові об'єкти є об'єктами типу 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' мають різні типи, але об'єкт а типу Object
// конвертується в об'єкт типу String 'foo' перед порівнянням
a == 'foo'

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

Специфікація Статус Коментар
ECMAScript 1st Edition (ECMA-262) Standard Initial definition. Implemented in JavaScript 1.0
ECMAScript 3rd Edition (ECMA-262) Standard Adds === and !== operators. Implemented in JavaScript 1.3
ECMAScript 5.1 (ECMA-262) Standard Defined in several sections of the specification: Relational Operators, Equality Operators
ECMAScript 2015 (6th Edition, ECMA-262) Standard Defined in several sections of the specification: Relational Operators, Equality Operators
ECMAScript Latest Draft (ECMA-262) Draft Defined in several sections of the specification: Relational Operators, Equality Operators

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

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Equality (a == b) Yes Yes1 Yes Yes Yes
Inequality (a != b) Yes Yes1 Yes Yes Yes
Identity (a === b) Yes Yes1 Yes Yes Yes
Non-identity (a !== b) Yes Yes1 Yes Yes Yes
Greater than (a > b) Yes Yes1 Yes Yes Yes
Greater than or equal (a >= b) Yes Yes1 Yes Yes Yes
Less than (a < b) Yes Yes1 Yes Yes Yes
Less than or equal (a <= b) Yes Yes1 Yes Yes Yes
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Equality (a == b) Yes Yes Yes4 Yes Yes Yes
Inequality (a != b) Yes Yes Yes4 Yes Yes Yes
Identity (a === b) Yes Yes Yes4 Yes Yes Yes
Non-identity (a !== b) Yes Yes Yes4 Yes Yes Yes
Greater than (a > b) Yes Yes Yes4 Yes Yes Yes
Greater than or equal (a >= b) Yes Yes Yes4 Yes Yes Yes
Less than (a < b) Yes Yes Yes4 Yes Yes Yes
Less than or equal (a <= b) Yes Yes Yes4 Yes Yes Yes

Див. також

Мітки документа й учасники

Зробили внесок у цю сторінку: YaroslavD, GrytsiukSerhiy, asmforce
Востаннє оновлена: YaroslavD,