Movatterモバイル変換


[0]ホーム

URL:


  1. Веб-технологии для разработчиков
  2. JavaScript
  3. Справочник по JavaScript
  4. Выражения и операторы
  5. Нестрогое равенство (==)

This page was translated from English by the community.Learn more and join the MDN Web Docs community.

View in EnglishAlways switch to English

Нестрогое равенство (==)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨июль 2015 г.⁩.

Операторнестрогого равенства (==) проверяет, являются ли два его операнда равными, возвращая логическое значение.В отличие от операторастрогого равенства пытается привести и сравнить операнды разных типов.

Интерактивный пример

console.log(1 == 1);// Expected output: trueconsole.log("hello" == "hello");// Expected output: trueconsole.log("1" == 1);// Expected output: trueconsole.log(0 == false);// Expected output: true

Синтаксис

js
x == y

Описание

Операторы нестрогого равенства (== и!=) используют алгоритмIsLooselyEqual. Его можно описать приблизительно так:

  1. Если операнды имеют одинаковый тип, они сравниваются следующим образом:
    • Объект: возвращаетсяtrue только если оба операнда ссылаются на один и тот же объект.
    • Строка: возвращаетсяtrue только если оба операнда содержат одинаковые символы в одинаковом порядке и регистре.
    • Число: возвращаетсяtrue только если оба операнда имеют идентичные значения.+0 и-0 считаются равными между собой. Если один из операндов являетсяNaN, возвращаетсяfalse. Таким образом,NaN никогда не равенNaN.
    • Логическое значение: возвращаетсяtrue только если оба операндаtrue или обаfalse.
    • BigInt: возвращаетсяtrue только если оба операнда имеют идентичные значения.
    • Символ: возвращаетсяtrue только если оба операнда ссылаются на один и тот же символ.
  2. Если один из операндов являетсяnull илиundefined, другой также должен бытьnull илиundefined, чтобы возвращалосьtrue. Иначе возвращаетсяfalse.
  3. Если один из операндов является объектом, а другой примитивом, тообъект приводится к примитиву.
  4. На этом шаге оба операнда приведены к одному типу (строка, число, логическое значение, символ или BigInt). В некоторых случаях могут производиться дополнительные преобразования.
    • Если оба операнда одинакового типа, то они сравниваются, используя шаг 1.
    • Если один из операндов является символьным значением, а другой — нет, то возвращаетсяfalse.
    • Если один из операндов является логическим значением, а другой — нет, тологическое значение приводится к числу:true преобразуется в 1, аfalse в 0. Затем снова происходит сравнение.
    • Число и строка:строка приводится к числу. Неудачная конвертация приводит к результатуNaN, что гарантирует возвращениеfalse.
    • Число и BigInt: сравниваются их числовые значения. Если числом является ±Infinity илиNaN, возвращаетсяfalse.
    • Строка и BigInt: строка приводится к BigInt с использованием того же самого алгоритма, что и в конструктореBigInt(). При неудачной конвертации возвращаетсяfalse.

Нестрогое равенствосимметрично:A == B всегда идентичноB == A для любых значенийA иB (кроме порядка применённых преобразований).

Основная разница между этим оператором и операторомстрогого равенства (===) в том, что оператор строгого равенства не пытается привести операнды к одному типу. Вместо этого он всегда считает операнды разных типов не равными. Оператор строгого равенства, по сути, выполняет только шаг 1 и возвращаетfalse для всех остальных случаев.

Существует «умышленное нарушение» вышеприведённого алгоритма: если одним из операндов являетсяdocument.all, он считается равнымundefined. Это означает, чтоdocument.all == null равноtrue, ноdocument.all === undefined && document.all === null равноfalse.

Примеры

Сравнение без приведения типов

js
1 == 1; // true"hello" == "hello"; // true

Сравнение с приведением типов

js
"1" == 1; // true1 == "1"; // true0 == false; // true0 == null; // false0 == undefined; // false0 == !!null; // true, обратите внимание на двойное логическое отрицание0 == !!undefined; // true, обратите внимание на двойное логическое отрицаниеnull == undefined; // trueconst number1 = new Number(3);const number2 = new Number(3);number1 == 3; // truenumber1 == number2; // false

Сравнение объектов

js
const object1 = {  key: "value",};const object2 = {  key: "value",};console.log(object1 == object2); // falseconsole.log(object1 == object1); // true

Сравнение строк и строковых объектов

Обратите внимание, что строки, созданные при помощиnew String() являются объектами. Если сравнивать такой объект со строковым литералом, то он будет приведён к строковому литералу и сравнение будет произведено по содержимому. Однако, если оба операнда являются объектами типаString, то они сравниваются как объекты и сравнение будет произведено по ссылке:

js
const string1 = "hello";const string2 = String("hello");const string3 = new String("hello");const string4 = new String("hello");console.log(string1 == string2); // trueconsole.log(string1 == string3); // trueconsole.log(string2 == string3); // trueconsole.log(string3 == string4); // falseconsole.log(string4 == string4); // true

Сравнение дат и строк

js
const d = new Date("1995-12-17T03:24:00");const s = d.toString(); // например: "Sun Dec 17 1995 03:24:00 GMT-0800 (Pacific Standard Time)"console.log(d == s); // true

Сравнение массивов и строк

js
const a = [1, 2, 3];const b = "1,2,3";a == b; // true, `a` приводится к строкеconst c = [true, 0.5, "hey"];const d = c.toString(); // "true,0.5,hey"c == d; // true

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

Specification
ECMAScript® 2026 Language Specification
# sec-equality-operators

Совместимость с браузерами

Смотрите также

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp