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

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

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

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

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

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

Рівність (==)

Оператор рівності конвертує операнди, якщо вони не однакового типу, і лише після цього застосовує строге порівняння. В разі, якщо обидва операнда є об'єктами, 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

Нерівність (!=)

Оператор нерівності повертає 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 = {'value': 'key'}, object2 = {'value': 'key'};
object1 === object2 //false

 

Неідентичність / строга нерівність (!==)

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

Синтаксис

x !== y

Приклади

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

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

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

Більше ніж (>)

Оператор більше повертає 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

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

Оператори стандартної рівності (== 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 Початкове визначення. Реалізовано у JavaScript 1.0
ECMAScript 3rd Edition (ECMA-262) Standard Додані оператори === та !== . Реалізовано у JavaScript 1.3
ECMAScript 5.1 (ECMA-262) Standard Дано визначення у декільках секціях специфікації: Relational Operators, Equality Operators
ECMAScript 2015 (6th Edition, ECMA-262) Standard Дано визначення у декільках секціях специфікації: Relational Operators, Equality Operators
ECMAScript Latest Draft (ECMA-262) Draft Дано визначення у декільках секціях специфікації: Relational Operators, Equality Operators

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Equality (a == b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Inequality (a != b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Identity (a === b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Non-identity (a !== b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Greater than (a > b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Greater than or equal (a >= b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Less than (a < b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Less than or equal (a <= b)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також

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

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