Какой оператор равенства (== vs ===) следует использовать при сравнении JavaScript?

Я использую JSLint для прохождения JavaScript, и он возвращает множество предложений по замене == (два равных знаков) с === (три знака равенства) при выполнении таких вещей, как сравнение idSele_UNVEHtype.value.length == 0 внутри оператора if.

Есть ли преимущество в производительности при замене == на ===?

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

Если преобразование типов не происходит, будет ли прирост производительности по сравнению с ==?


person bcasp    schedule 11.12.2008    source источник


Ответы (48)


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

Ссылка: Руководство по Javascript: операторы сравнения

Оператор == выполнит сравнение на равенство после выполнения всех необходимых преобразований типов. Оператор === не выполняет преобразование, поэтому, если два значения не одного типа, === просто вернет false. Оба одинаково быстры.

Процитируя превосходный JavaScript: хорошие моменты Дугласа Крокфорда,

В JavaScript есть два набора операторов равенства: === и !== и их злые близнецы == и !=. Хорошие работают так, как вы ожидаете. Если два операнда относятся к одному типу и имеют одинаковое значение, тогда === дает true, а !== дает false. Злые близнецы поступают правильно, когда операнды одного типа, но если они разных типов, они пытаются принудить значения. правила, по которым они это делают, сложны и незабываемы. Вот некоторые из интересных случаев:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

Таблица сравнения равенства

Настораживает отсутствие транзитивности. Мой совет - никогда не использовать злых близнецов. Вместо этого всегда используйте === и !==. Все только что показанные сравнения дают false с оператором ===.


Обновлять:

Хороший момент был поднят @Casebash в комментариях и в ответ @ Phillipe Laybaert об объектах. Для объектов == и === действуют согласованно друг с другом (кроме особых случаев).

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

Особый случай - это когда вы сравниваете примитив с объектом, который оценивается как тот же примитив, из-за его toString или valueOf метода. Например, рассмотрим сравнение строкового примитива со строковым объектом, созданным с помощью конструктора String.

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

Здесь оператор == проверяет значения двух объектов и возвращает true, но === видит, что они не одного типа, и возвращает false. Который правильный? Это действительно зависит от того, что вы пытаетесь сравнить. Мой совет - полностью обойти вопрос и просто не использовать конструктор String для создания строковых объектов из строковых литералов.

Справочник
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

person Bill the Lizard    schedule 11.12.2008
comment
Я также хотел бы указать, что 0 === -0 и NaN! == NaN, что иногда может сбивать с толку. Если вы хотите различать ± 0 и считать NaN равными, используйте Object.is (ES2015) - person Ovinus Real; 11.10.2020
comment
Мягкий набор текста - это особенность. Очевидно, Крокфорд указывает на некоторые артефакты дизайнерского решения, но мягкая печать по-прежнему остается функцией. При правильном использовании его абсолютно нормально использовать. Не выбрасывайте ребенка вместе с водой из ванны. - person aross; 25.03.2021

Использование оператора == (Равенство)

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

Использование оператора === (Идентификация)

true === 1; //false
"2" === 2;  //false

Это связано с тем, что оператор равенства == выполняет приведение типов, что означает, что интерпретатор неявно пытается преобразовать значения перед сравнением.

С другой стороны, оператор идентичности === не выполняет приведение типов и, следовательно, не преобразует значения при сравнении и, следовательно, работает быстрее (согласно Этот эталонный тест JS), поскольку он пропускает один шаг.

person Community    schedule 11.12.2008

Интересное графическое изображение сравнения равенства между == и ===.

Источник: http://dorey.github.io/JavaScript-Equality-Table/


var1 === var2

При использовании === для проверки равенства JavaScript все как есть. До оценки ничего не конвертируется.

Оценка равенства === в JS


var1 == var2

При использовании == для проверки равенства JavaScript происходят некоторые необычные преобразования.

Оценка равенства == в JS


Заключение:

Всегда используйте ===.

(Если вы полностью не понимаете преобразования, которые происходят с ==.)

person SNag    schedule 05.05.2014
comment
Лучшая таблица '==': algassert.com/ визуализация / 2014/03/27 / - person rocketsarefast; 24.05.2021

В ответах здесь я ничего не читал о том, что означает равно. Некоторые скажут, что === означает одинаковые и однотипные, но это не совсем так. Фактически это означает, что оба операнда ссылаются на один и тот же объект или, в случае типов значений, имеют одно и то же значение.

Итак, возьмем следующий код:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Тут то же самое:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Или даже:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Такое поведение не всегда очевидно. В этой истории есть нечто большее, чем равенство и принадлежность к одному типу.

Правило такое:

Для типов значений (чисел):
a === b возвращает истину, если a и b имеют одинаковое значение и относятся к одному типу.

Для ссылочных типов:
a === b возвращает значение true, если a и b ссылаются на один и тот же объект.

Для строк:
a === b возвращает истину, если a и b являются строками и содержат одни и те же символы.


Струны: особый случай ...

Строки не являются типами значений, но в Javascript они ведут себя как типы значений, поэтому они будут равны, когда символы в строке одинаковы и когда они имеют одинаковую длину (как объяснено в третьем правиле)

Теперь становится интересно:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

Но как насчет этого ?:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Я думал, что строки ведут себя как типы значений? Ну, это зависит от того, кого вы спросите ... В этом случае a и b не одного типа. a относится к типу Object, а b - к типу string. Просто помните, что создание строкового объекта с помощью конструктора String создает что-то типа Object, которое ведет себя как строка большую часть времени.

person Philippe Leybaert    schedule 05.06.2009

Позвольте мне добавить этот совет:

Если сомневаетесь, прочтите спецификацию !

ECMA-262 - это спецификация языка сценариев, диалектом которого является JavaScript. Конечно, на практике поведение наиболее важных браузеров имеет большее значение, чем эзотерическое определение того, как что-то должно обрабатываться. Но полезно понять, почему new String (a)! == a.

Пожалуйста, позвольте мне объяснить, как читать спецификацию, чтобы прояснить этот вопрос. Я вижу, что в этой очень старой теме никто не дал ответа на очень странный эффект. Итак, если вы можете прочитать спецификацию, это очень поможет вам в вашей профессии. Это приобретенный навык. Итак, продолжим.

Поиск в файле PDF по запросу === приводит меня к странице 56 спецификации: 11.9.4. Оператор строгого равенства (===), и, пройдя через спецификацию, я нахожу:

11.9.6 Алгоритм сравнения строгого равенства
Сравнение x === y, где x и y - значения, дает true или false . Такое сравнение выполняется следующим образом:
1. Если Тип (x) отличается от Типа (y), вернуть false.
2. Если Тип (x) не определен, вернуть true.
3. Если Type (x) равен Null, вернуть true.
4. Если Type (x) не Number, перейдите к шагу 11. .
5. Если x равно NaN, вернуть false.
6. Если y равно NaN, вернуть false .
7. Если x имеет то же числовое значение, что и y, вернуть истину.
8. Если x равно +0, а y равно −0, вернуть true.
9. Если x равен −0, а y равен +0, вернуть true.
10. Вернуть false.
11. Если Тип (x) равен String, то вернуть true, если x и y - это одна и та же последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях); в противном случае верните false.
12. Если Type (x) - Boolean, верните true, если x и y оба являются true или оба false; в противном случае верните false.
13. Верните true, если x и y относятся к одному и тому же объекту или если они относятся к объектам, соединенным друг с другом (см. 13.1.2. ). В противном случае верните false.

Интересен шаг 11. Да, строки рассматриваются как типы значений. Но это не объясняет, почему new String (a)! == a. У нас есть браузер, не соответствующий ECMA-262?

Не так быстро!

Проверим типы операндов. Попробуйте сами, заключив их в typeof (). Я обнаружил, что new String (a) является объектом, и используется шаг 1: вернуть false, если типы различаются.

Если вам интересно, почему new String (a) не возвращает строку, как насчет упражнения по чтению спецификации? Повеселись!


Айдиакапи написал об этом в комментарии ниже:

Из спецификации

11.2.2 Новый оператор:

Если тип (конструктор) не является объектом, вызовите исключение TypeError.

Другими словами, если String не относится к типу Object, его нельзя использовать с оператором new.

new всегда возвращает объект, даже для конструкторов String. Увы! Семантика значений для строк (см. Шаг 11) теряется.

И, наконец, это означает: new String (a)! == a.

person nalply    schedule 28.11.2009

Я тестировал это в Firefox с помощью Firebug, используя такой код:

console.time("testEquality");
var n = 0;
while (true) {
  n++;
  if (n == 100000)
    break;
}
console.timeEnd("testEquality");

а также

console.time("testTypeEquality");
var n = 0;
while (true) {
  n++;
  if (n === 100000)
    break;
}
console.timeEnd("testTypeEquality");

Мои результаты (проверены по пять раз и усреднены):

==: 115.2
===: 114.4

Поэтому я бы сказал, что мизерная разница (это более 100000 итераций, помните) незначительна. Эффективность не причина делать ===. Типовая безопасность (ну, насколько безопасно, как вы собираетесь получить в JavaScript), и качество кода.

person Simon Scarfe    schedule 25.12.2008
comment
Теперь, как они сравниваются, когда есть фактическое приведение типа для оператора ==? Помните, что тогда производительность повышается. - person Hubert OG; 14.07.2013
comment
ОСНОВНАЯ разница при правильном тестировании по вышеупомянутым причинам, заключающаяся в более быстрой проверке только неравенства типов. jsfiddle.net/4jhuxkb2 - person Doug Morrow; 06.07.2015

В PHP и JavaScript это оператор строгого равенства. Это означает, что он будет сравнивать как тип, так и значения.

person Shiki    schedule 12.05.2010

В JavaScript это означает одно и то же значение и тип.

Например,

4 == "4" // will return true

но

4 === "4" // will return false 
person Dimitar    schedule 12.05.2010

Оператор === называется оператором строгого сравнения, он чем отличается от оператора ==.

Возьмем 2 варианта a и b.

Чтобы "a == b" было истинным, a и b должны быть одинаковыми значениями.

В случае "a === b" a и b должны быть одного и того же значения, а также того же типа, чтобы оно оценивалось как правда.

Возьмем следующий пример

var a = 1;
var b = "1";

if (a == b) //evaluates to true as a and b are both 1
{
    alert("a == b");
}

if (a === b) //evaluates to false as a is not the same type as b
{
    alert("a === b");
}

Вкратце; использование оператора == может иметь значение true в ситуациях, когда вы этого не хотите, поэтому использование оператора === будет более безопасным.

В сценарии использования 90% не имеет значения, какой из них вы используете, но полезно знать разницу, когда однажды вы обнаружите какое-то неожиданное поведение.

person Doctor Jones    schedule 11.12.2008

Почему == так непредсказуемо?

Что вы получите, если сравните пустую строку "" с нулевым числом 0?

true

Да, верно, согласно ==, пустая строка и ноль совпадают.

И это еще не все, вот еще один:

'0' == false // true

С массивами дела обстоят очень странно.

[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true

Тогда еще страннее со строками

[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!

Становится хуже:

Когда равно не равно?

let A = ''  // empty string
let B = 0   // zero
let C = '0' // zero string

A == B // true - ok... 
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!

Позвольте мне сказать это еще раз:

(A == B) && (B == C) // true
(A == C) // **FALSE**

И это просто безумие, которое можно получить с примитивами.

Когда вы используете == с объектами, это совершенно новый уровень безумия.

В этот момент вам, вероятно, интересно ...

Почему это происходит?

Это потому, что в отличие от "Triple Equals" (===), который просто проверяет, совпадают ли два значения.

== выполняет множество других функций.

Он имеет специальную обработку для функций, специальную обработку для значений NULL, undefined, строк и т. Д.

Это довольно странно.

Фактически, если вы попытаетесь написать функцию, которая делает то, что ==, она будет выглядеть примерно так:

function isEqual(x, y) { // if `==` were a function
    if(typeof y === typeof x) return y === x;
    // treat null and undefined the same
    var xIsNothing = (y === undefined) || (y === null);
    var yIsNothing = (x === undefined) || (x === null);

    if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);

    if(typeof y === "function" || typeof x === "function") {
        // if either value is a string 
        // convert the function into a string and compare
        if(typeof x === "string") {
            return x === y.toString();
        } else if(typeof y === "string") {
            return x.toString() === y;
        } 
        return false;
    }

    if(typeof x === "object") x = toPrimitive(x);
    if(typeof y === "object") y = toPrimitive(y);
    if(typeof y === typeof x) return y === x;

    // convert x and y into numbers if they are not already use the "+" trick
    if(typeof x !== "number") x = +x;
    if(typeof y !== "number") y = +y;
    // actually the real `==` is even more complicated than this, especially in ES6
    return x === y;
}

function toPrimitive(obj) {
    var value = obj.valueOf();
    if(obj !== value) return value;
    return obj.toString();
}

Что это значит?

Значит, == сложно.

Поскольку это сложно, трудно понять, что произойдет, когда вы его используете.

Это означает, что вы можете столкнуться с ошибками.

Итак, мораль этой истории ...

Сделайте свою жизнь менее сложной.

Используйте === вместо ==.

Конец.

person Luis Perez    schedule 09.08.2016

=== проверяет, что одинаковые стороны равны по типу и значению.


Пример:

'1' === 1 // will return "false" because `string` is not a `number`

Типичный пример:

0 == ''  // will be "true", but it's very common to want this check to be "false"

Другой распространенный пример:

null == undefined // returns "true", but in most cases a distinction is necessary

Часто бывает удобна нетипизированная проверка, потому что вам все равно, будет ли значение undefined, null, 0 или ""

person vsync    schedule 12.05.2010

Блок-схема выполнения Javascript для строгого равенства / сравнения '==='

Строгое равенство Javascript

Блок-схема выполнения Javascript для нестрогого равенства / сравнения '=='

Неравенство Javascript

person Samar Panda    schedule 05.09.2015

JavaScript === против ==.

0==false   // true
0===false  // false, because they are of a different type
1=="1"     // true, auto type coercion
1==="1"    // false, because they are of a different type
person Community    schedule 03.07.2013

Это означает, что равенство без приведения типов принуждение типа означает, что JavaScript не преобразует автоматически любые другие типы данных в строковые типы данных.

0==false   // true,although they are different types

0===false  // false,as they are different types

2=='2'    //true,different types,one is string and another is integer but 
            javaScript convert 2 to string by using == operator 

2==='2'  //false because by using === operator ,javaScript do not convert 
           integer to string 

2===2   //true because both have same value and same types 
person Pop Catalin    schedule 12.05.2010

В типичном скрипте разницы в производительности не будет. Более важным может быть тот факт, что тысяча "===" на 1 КБ тяжелее тысячи "==" :) профилировщиков JavaScript может сказать вам, есть ли разница в производительности в вашем случае.

Но лично я бы сделал то, что предлагает JSLint. Эта рекомендация существует не из-за проблем с производительностью, а потому, что приведение типов означает, что ('\t\r\n' == 0) истинно.

person Constantin    schedule 16.12.2008

Оператор сравнения равенства == сбивает с толку, и его следует избегать.

Если вы ДОЛЖНЫ смириться с этим, помните следующие 3 вещи:

  1. Это не транзитивно: (a == b) и (b == c) не приводит к (a == c)
  2. Он является взаимоисключающим по отношению к своему отрицанию: (a == b) и (a! = b) всегда имеют противоположные логические значения со всеми a и b. < / сильный>
  3. В случае сомнений выучите наизусть следующую таблицу истинности:

ТАБЛИЦА ИСТИНЫ РАВНОГО ОПЕРАТОРА В JAVASCRIPT

  • Каждая строка в таблице представляет собой набор из 3 взаимно «равных» значений, что означает, что любые 2 значения среди них равны с использованием знака равенства == *

** СТРАННО: обратите внимание, что любые два значения в первом столбце не равны в этом смысле. **

''       == 0 == false   // Any two values among these 3 ones are equal with the == operator
'0'      == 0 == false   // Also a set of 3 equal values, note that only 0 and false are repeated
'\t'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\r'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\n'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\t\r\n' == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

null == undefined  // These two "default" values are not-equal to any of the listed values above
NaN                // NaN is not equal to any thing, even to itself.
person CuongHuyTo    schedule 16.09.2011

Маловероятно, что будет какая-либо разница в производительности между двумя операциями при вашем использовании. Преобразования типа не требуется, поскольку оба параметра уже относятся к одному типу. Обе операции будут иметь сравнение типов, за которым следует сравнение значений.

person Sean    schedule 11.12.2008

Да! Это имеет значение.

Оператор === в javascript проверяет значение, а также тип, где оператор == просто проверяет значение (при необходимости выполняет преобразование типа).

введите описание изображения здесь

Вы можете легко это проверить. Вставьте следующий код в HTML-файл и откройте его в браузере.

<script>

function onPageLoad()
{
    var x = "5";
    var y = 5;
    alert(x === 5);
};

</script>

</head>

<body onload='onPageLoad();'>

В предупреждении вы получите сообщение «false». Теперь измените метод onPageLoad() на alert(x == 5);, вы получите true.

person Aniket Thakur    schedule 14.11.2014

Оператор === проверяет значения, а также типы переменных на равенство.

Оператор == просто проверяет значение переменных на равенство.

person Niraj CHoubey    schedule 12.05.2010

Просто

== означает сравнение операндов с приведением типа.

а также

=== означает сравнение операндов без приведения типа.

Приведение типов в JavaScript означает автоматическое преобразование типов данных в другие типы данных.

Например:

123 == "123"  // Returns true, because JS coerces string "123" to number 123
              // and then goes on to compare `123 == 123`.

123 === "123" // Returns false, because JS does not coerce values of different types here.
person Amit    schedule 20.03.2015

Это строгий контрольный тест.

Это хорошо, особенно если вы проверяете от 0 до false и null.

Например, если у вас есть:

$a = 0;

Потом:

$a==0; 
$a==NULL;
$a==false;

Все вернет истину, и вы можете этого не захотеть. Предположим, у вас есть функция, которая может возвращать 0-й индекс массива или false в случае ошибки. Если вы проверите с "==" false, вы можете получить запутанный результат.

Итак, с тем же, что и выше, но со строгим тестом:

$a = 0;

$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false
person Daniel    schedule 12.05.2010
comment
В JavaScript это совершенно неправильно и ошибочно неполно. 0 != null. -1 - person Ry-♦; 06.05.2013

JSLint иногда дает вам нереальные причины для внесения изменений. === имеет точно такую ​​же производительность, что и ==, если типы уже совпадают.

Это быстрее, только когда типы не совпадают, и в этом случае он не пытается преобразовать типы, а напрямую возвращает false.

Итак, IMHO, JSLint можно использовать для написания нового кода, но следует избегать бесполезной чрезмерной оптимизации любой ценой.

Это означает, что нет причин менять == на === в проверке типа if (a == 'test'), если вы знаете, что это может быть только String.

Такое изменение большого количества кода тратит время разработчиков и рецензентов и ни к чему не приводит.

person ashes    schedule 05.06.2012
comment
Интересно, что a.length===4 на самом деле медленнее в Firefox, чем a.length==4. В любом случае это микрооптимизация, но это противоречит тому, что люди утверждают. - person aross; 25.03.2021

Как правило, я бы использовал === вместо ==!== вместо !=).

Причины объяснены в ответах выше, а также Дуглас Крокфорд довольно ясно об этом говорит (JavaScript: хорошие моменты).

Однако есть одно единственное исключение: == null - это эффективный способ проверить, не является ли значение null или undefined:

if( value == null ){
    // value is either null or undefined
}

Например, jQuery 1.9.1 использует этот шаблон 43 раза, а средство проверки синтаксиса JSHint даже предоставляет eqnull расслабляющий вариант по этой причине.

Из руководства по стилю jQuery:

Строгие проверки равенства (===) следует использовать в пользу ==. Единственное исключение - проверка на undefined и null посредством null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

ИЗМЕНИТЬ 2021-03:

В настоящее время большинство браузеров поддерживают нулевой оператор объединения (??) и Логическое присвоение значения null (??=), которое позволяет более кратко назначать значение по умолчанию, если переменная имеет значение null или undefined, для пример:

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

можно записать как любую из этих форм

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;
person mar10    schedule 27.04.2013
comment
«== null - эффективный способ проверить" is null or undefined " или document.all. - person Sebastian Simon; 15.03.2021

Простой пример:

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.
person Vikas    schedule 14.05.2015

В двух верхних ответах оба упомянутых == означает равенство, а === означает идентичность. К сожалению, это утверждение неверно.

Если оба операнда == являются объектами, они сравниваются, чтобы увидеть, являются ли они одним и тем же объектом. Если оба операнда указывают на один и тот же объект, тогда оператор равенства возвращает true. В противном случае двое не равны.

var a = [1, 2, 3];  
var b = [1, 2, 3];  
console.log(a == b)  // false  
console.log(a === b) // false  

В приведенном выше коде и ==, и === получают значение false, потому что a и b не являются одними и теми же объектами.

То есть: если оба операнда == являются объектами, == ведет себя так же, как ===, что также означает идентичность. Существенная разница этих двух операторов заключается в преобразовании типов. == имеет преобразование до проверки равенства, а === нет.

person Harry He    schedule 09.09.2013

Проблема в том, что у вас могут легко возникнуть проблемы, поскольку в JavaScript много неявных преобразований, что означает ...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

Что довольно скоро становится проблемой. Лучший пример того, почему неявное преобразование является «злом», можно найти в этом коде в MFC / C ++. который на самом деле будет компилироваться из-за неявного преобразования из CString в HANDLE, который является типом typedef указателя ...

CString x;
delete x;

Что, очевидно, во время выполнения делает очень неопределенные вещи ...

Google для неявных преобразований в C ++ и STL, чтобы получить некоторые аргументы против этого ...

person Thomas Hansen    schedule 29.12.2008
comment
0 == null ложно. - person Garrett; 13.01.2014

Из основной справки по javascript

=== Возвращает true, если операнды строго равны (см. Выше) без преобразования типа.

person Paul Butcher    schedule 12.05.2010

Сравнение равенства:

Оператор ==

Возвращает истину, если оба операнда равны. Перед сравнением операнды преобразуются в один и тот же тип.

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

Равенство и сравнение типов:

Оператор ===

Возвращает истину, если оба операнда равны и одного типа. Как правило, лучше и безопаснее сравнивать таким образом, потому что здесь нет скрытых преобразований типов.

>>> 1 === '1'
false
>>> 1 === 1
true
person user2601995    schedule 02.10.2013

Вот удобная сравнительная таблица, в которой показаны происходящие преобразования и различия между == и ===.

Как говорится в заключении:

«Используйте три равных, если вы полностью не понимаете, какие преобразования происходят для двух равных».

http://dorey.github.io/JavaScript-Equality-Table/

person Christian Hagelid    schedule 27.03.2014

null и undefined - это ничто, то есть

var a;
var b = null;

Здесь a и b не имеют значений. Тогда как 0, false и '' - все значения. Их объединяет то, что все они являются ложными значениями, что означает, что все они удовлетворяют ложным условиям.

Итак, 0, false и '' вместе образуют подгруппу. С другой стороны, значения null и undefined образуют вторую подгруппу. Проверьте сравнения на изображении ниже. null и undefined будут равны. Остальные трое будут равны друг другу. Но все они рассматриваются в JavaScript как ложные.

Введите описание изображения здесь

Это то же самое, что и любой объект (например, {}, массивы и т. Д.), Непустая строка и логическое значение true являются истинными условиями. Но не все они равны.

person Community    schedule 14.04.2014

* Операторы === vs == *

1 == true    =>    true
true == true    =>    true
1 === true    =>    false
true === true    =>    true
person Mr.G    schedule 19.03.2014

В JavaScript есть как строгие сравнения, так и сравнения с преобразованием типов. Строгое сравнение (например, ===) верно только в том случае, если операнды одного типа. Более часто используемое абстрактное сравнение (например, ==) преобразует операнды в один и тот же тип перед выполнением сравнения.

  • Оператор равенства (==) преобразует операнды, если они не одного типа, а затем применяет строгое сравнение. Если один из операндов является числом или логическим значением, операнды по возможности преобразуются в числа; иначе, если любой из операндов является строкой, строковый операнд преобразуется в число, если это возможно. Если оба операнда являются объектами, тогда JavaScript сравнивает внутренние ссылки, которые равны, когда операнды ссылаются на один и тот же объект в памяти.

    Синтаксис:

    x == y

    Примеры:

    3 == 3     // true
    "3" == 3   // true
    3 == '3'   // true
    
  • Оператор идентичности / строгого равенства (===) возвращает истину, если операнды строго равны (см. Выше) без преобразования типов.

    Синтаксис:

    x === y

    Примеры:

    3 === 3 // true

Для справки: операторы сравнения < / em> (Сеть разработчиков Mozilla)

person garakchy    schedule 08.08.2014

Если вы создаете веб-приложение или защищенную страницу, вы всегда должны использовать (только когда это возможно)

===

потому что он проверит, является ли это одним и тем же содержимым и одного типа!

поэтому, когда кто-то входит:

var check = 1;
if(check == '1') {
    //someone continued with a string instead of number, most of the time useless for your webapp, most of the time entered by a user who does not now what he is doing (this will sometimes let your app crash), or even worse it is a hacker searching for weaknesses in your webapp!
}

но с

var check = 1;
if(check === 1) {
    //some continued with a number (no string) for your script
} else {
    alert('please enter a real number');
}

хакер никогда не углубится в систему, чтобы найти ошибки и взломать ваше приложение или ваших пользователей

Я хочу сказать, что

===

добавит безопасности вашим скриптам

конечно, вы также можете проверить, является ли введенное число действительным, является ли оно строкой и т. д. с помощью других операторов if внутри первого примера, но это, по крайней мере, для меня легче понять и использовать

Причина, по которой я опубликовал это, заключается в том, что в этом разговоре никогда не использовалось слово «более безопасный» или «безопасность» (если вы посмотрите на iCloud.com, он использует 2019 раз === и 1308 раз ==, это также означает, что вы иногда используйте == вместо ===, потому что в противном случае это заблокирует вашу функцию, но, как сказано в начале, вы должны использовать === как можно чаще)

person Sake Salverda    schedule 28.11.2014

Мой процесс рассуждений с использованием emacs org-mode и node.js для запуска теста.

| use ==     | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| ''         | x  | f   | t     | f       | f         | f    | f          |
| '0'        |    | x   | t     | f       | f         | f    | f          |
| false      |    |     | x     | f       | f         | f    | t          |
| 'false'    |    |     |       | x       | f         | f    | f          |
| undefined  |    |     |       |         | x         | t    | f          |
| null       |    |     |       |         |           | x    | f          |
| ' \t\r\n ' |    |     |       |         |           |      | x          | 



| use ===    | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| ''         | x  | f   | f     | f       | f         | f    | f          |
| '0'        |    | x   | f     | f       | f         | f    | f          |
| false      |    |     | x     | f       | f         | f    | f          |
| 'false'    |    |     |       | x       | f         | f    | f          |
| undefined  |    |     |       |         | x         | f    | f          |
| null       |    |     |       |         |           | x    | f          |
| ' \t\r\n ' |    |     |       |         |           |      | x          |

Мой тестовый скрипт ниже: run> node xxx.js

var rowItems = ['', '0', false, 'false', undefined, null, ' \t\r\n ']
var colItems = rowItems

for(var i = 0; i < rowItems.length; i++) {
    for (var j = 0; j < colItems.length; j++) {
        var r = (rowItems[i] === colItems[j]) ? true : false;
        console.log(rowItems[i] + " = " + colItems[j] + " " + r + " [" + i + "] ==> [" + j + "]")
    };
}
person CodeFarmer    schedule 06.08.2015

=== заботится о том, совпадают ли объекты. Следовательно, new String("Hello world") === "Hello world" возвращает false. Однако == не заботится о том, совпадают ли объекты; он просто преобразует один аргумент в тип другого: если преобразование невозможно, верните false. Тогда new String("Hello world") == "Hello world" возвращает true вместо false.

person Community    schedule 29.03.2015
comment
Этот ответ немного ошибочен или, по крайней мере, не очень точен… «объекты»? Вы имеете в виду «типы»? == заботится о том, совпадают ли типы; он делегирует строгое сравнение на равенство, если они есть. Два объекта сравниваются по ссылке, но это касается обоих операторов. «если преобразование невозможно» - я думаю ... но обычно возможно принуждение, и этого недостаточно, чтобы вызвать тот или иной результат сравнения, например "undefined" != undefined, хотя принуждение было бы возможно. - person Sebastian Simon; 15.03.2021

JavaScript - это слабо типизированный язык, т.е. без каких-либо типов данных, как в C, например, C ++. int, boolean, float и т. д., таким образом, переменная может содержать любой тип значения, поэтому существуют эти специальные операторы сравнения

Eg

var i = 20;var j = "20";

если мы применим операторы сравнения, результат этих переменных будет

i==j //result is true

or

j != i//result is false

для этого нам нужны специальные операторы сравнения, которые проверяют значение, а также тип данных переменной.

if we do

i===j //result is false
person Akshay Khale    schedule 22.07.2015

Разные между =, = =, = = =

  • Оператор = Используется только для присвоения value.
  • Оператор = = Используется для простого сравнения values, а не datatype
  • Оператор = = = Используется для сравнения values и datatype.
person RïshïKêsh Kümar    schedule 25.06.2017

Оператор == просто сравнивает значения, а не тип данных.

Оператор === сравнивает значения со сравнением своего типа данных.

eg :

1 == "1" //true

1 === "1" //false

Этот оператор ("===") используется в языках, которые выполняют автоматическое приведение типов, например. PHP, Javascript.
Оператор "===" помогает предотвратить неожиданное сравнение, вызванное автоматическим приведением типов.

person Sharad Kale    schedule 28.04.2017
comment
для '==' dataType не важен - person mrmr68; 25.05.2017
comment
@ mrmr68 Типом операндов абстрактного сравнения равенства является очень важно - он используется для приведения операндов к другим типам, чтобы их можно было сравнивать. - person Sebastian Simon; 22.05.2020

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

person Alexandr    schedule 01.07.2016

Да, существует большая разница между операторами равенства == и идентификатора ===.
Обычно оператор идентификации работает быстрее, потому что преобразование типов не выполняется. Но если значения одного типа, вы не увидите никакой разницы.
Посмотрите мой пост Легенда оператора равенства JavaScript, в которой объясняются детали, включая алгоритмы преобразования и сравнения типов, с множеством примеров.

person Dmitri Pavlutin    schedule 04.01.2016

Одна неупомянутая причина использования === - это случай, когда вы сосуществуете с / кросс-компиляцией в / из coffee-script. Из Маленькой книжки по CoffeeScript ...

Слабое сравнение на равенство в JavaScript ведет к путанице и часто является источником сбивающих с толку ошибок.

Решение состоит в том, чтобы вместо этого использовать оператор строгого равенства, который состоит из трех знаков равенства: ===. Он работает точно так же, как обычный оператор равенства, но без какого-либо приведения типов. Рекомендуется всегда использовать оператор строгого равенства и при необходимости явно преобразовывать типы.

Если вы регулярно конвертируете в coffee-script и обратно, вам следует просто использовать ===. Фактически, компилятор coffee-script заставит вас ...

CoffeeScript решает эту проблему, просто заменяя все слабые сравнения строгими, другими словами, преобразовывая все компараторы == в ===. В CoffeeScript нельзя выполнять слабое сравнение на равенство, и при необходимости следует явно преобразовывать типы перед их сравнением.

person Alex Gray    schedule 15.05.2016

Строгое равенство по большей части лучше

Тот факт, что Javascript - это слабо типизированный язык, должен постоянно находиться в вашем уме, когда вы работаете с ним. Пока структура данных одна и та же, действительно нет причин не использовать строгое равенство, при обычном равенстве часто происходит неявное преобразование значений, которое происходит автоматически, что может иметь далеко идущие последствия для вашего кода. Очень легко получить проблемы с этим преобразованием, поскольку они происходят автоматически.

При строгом равенстве автоматическое неявное преобразование отсутствует, поскольку значения уже должны иметь правильную структуру данных.

person Neil Meyer    schedule 16.11.2017

Javascript типизирован так же, как и php,

var x = "20";
var y =20;

if (x===y) // false

Это всегда будет давать вам ложь, потому что, хотя значения переменных одинаковы, типы данных не

Один - строка, другой - int

If(x==y)//true

Однако это просто проверяет, является ли контент одинаковым, независимо от типов данных ...

Я не хочу говорить, что значения равны, потому что строковое значение не может быть логически равно значению int

person yanguya995    schedule 01.07.2016

Во-первых, некоторая терминология о Javascript string equals: Double equals официально известна как оператор сравнения абстрактного равенства, а тройное равенство называется оператором сравнения строгого равенства. Различие между ними можно резюмировать следующим образом: абстрактное равенство будет пытаться разрешить типы данных посредством приведения типов перед выполнением сравнения. Строгое равенство вернет false, если типы разные. Рассмотрим следующий пример:

console.log(3 == "3"); // true
console.log(3 === "3"); // false.
console.log(3 == "3"); // true
console.log(3 === "3"); // false.

Использование двух знаков равенства возвращает истину, потому что строка «3» преобразуется в число 3 перед проведением сравнения. Три знака равенства означает, что типы разные, и возвращает false. Вот еще один:

console.log(true == '1'); // true
console.log(true === '1'); // false
console.log(true == '1'); // true
console.log(true === '1'); // false

Опять же, сравнение абстрактного равенства выполняет преобразование типа. В этом случае и логическое значение «истина», и строка «1» преобразуются в число 1, и результат будет истинным. Строгое равенство возвращает false.

Если вы понимаете, что уже хорошо разбираетесь в различиях между == и ===. Однако есть некоторые сценарии, в которых поведение этих операторов не интуитивно понятно. Давайте взглянем на еще несколько примеров:

console.log(undefined == null); // true
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.
console.log(undefined == null); // true     
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.

console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false
console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false

Пример ниже интересен тем, что он показывает, что строковые литералы отличаются от строковых объектов.

console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
person Rotimi    schedule 24.04.2017

Причина, по которой предлагается заменить == на ===, заключается в том, что оператор === более надежен, чем ==. В нашем контексте надежные средства === также используются для проверки типов. Принимая во внимание лучшие практики программирования, мы всегда должны выбирать более надежную функцию вместо менее надежной. Опять же, когда мы большую часть времени думаем о точно равном оператору, мы по умолчанию считаем, что тип должен быть таким же. Поскольку === предоставляет то же самое, мы должны пойти на это.

person Narendra Kalekar    schedule 01.08.2017

Дилемма «Должен ли я использовать == или === при сравнении JavaScript» аналогична вопросу: «Следует ли мне использовать« ложку »или« вилку »для еды.

Единственный разумный ответ на этот вопрос:

  1. Вы должны использовать сравнение динамического типа, например :== для сравнения свободного типа.
  2. Вы должны использовать сравнение статического типа, например :=== для сравнения строгого типа.

Это потому, что они разные. Они не имеют той же цели и не предназначены для использования с той же целью.

Конечно, и вилки, и ложки предназначены для «еды», но вы решите использовать их в соответствии с тем, что вам подали.

Значение: вы решите использовать «ложку», например: == для приготовления «супа» и / или «вилку», например: === для сбора.

Спросить, лучше ли использовать «вилку» или «ложку» для «еды» - все равно что спросить, лучше ли использовать статический [===] или динамический [==] уравнение, op. в JS. Оба вопроса одинаково неверны и отражают очень узкое или поверхностное понимание предмета, о котором идет речь.

person Bekim Bacaj    schedule 26.11.2017
comment
p.s .: JSLint (или Crockford) не подходит для того, чтобы настаивать или просить вас использовать строгое сравнение типов при работе со значениями одного и того же типа. Свойство JavaScript length всегда имеет тип: число. И поэтому нет места или возможности для фальшивого позитива. Кроме того, нет необходимости в dSele_UNVEHtype.value.length === 0, если вместо этого можно использовать прямое сокращение !dSele_UNVEHtype.value.length. - person Bekim Bacaj; 06.12.2017
comment
Зачем вам отвечать на вопрос 9-летней давности, на который уже есть 49 ответов, на который также есть принятый ответ с более чем 5 тыс. Голосов, с ответом, который содержит странную аналогию и не объясняет ничего из того, что еще не было сказано? - person Jasper; 22.12.2017
comment
Потому что существует множество профессиональных злоупотреблений JavaScript, независимо от того, сколько им лет. И вы, например, не смогли понять, что это такое, и уловить суть разницы, которую Live Script делает в отличие от языков статического типа. И зачем нам его интеллектуальная динамика. JavaScript был создан для творческих умных людей, а не для придурков. - person Bekim Bacaj; 26.12.2017
comment
Да, я согласен, что существует много злоупотреблений JavaScript. Однако я по-прежнему считаю вашу аналогию странной, поскольку ее можно легко неправильно понять, и она не охватывает существенным образом основных основ. - person Jasper; 27.12.2017
comment
Приведенная аналогия является лучшей иллюстрацией их различия и качества использования. Это лучшее короткое эссе, чтобы узнать абсолютную суть, даже если вы новичок в JS. И не менее хорош, возможно, лучше, чем мой поздний ответ о том, как очистить массив JS [по-настоящему]. - person Bekim Bacaj; 28.12.2017

Используйте ===, если вы хотите сравнить несколько вещей в JavaScript, это называется строгое равенство, это означает, что возвращается истина, если только тип и значение одинаковы, поэтому не было бы для вас нежелательной коррекции типа, если вы используете ==, вы в основном не заботитесь о типе, и во многих случаях вы можете столкнуться с проблемами при слабом сравнении равенства.

Строгое равенство с использованием ===

Строгое равенство сравнивает два значения на равенство. Ни одно из значений не будет неявно преобразовано в какое-либо другое значение перед сравнением. Если значения имеют разные типы, значения считаются неравными. В противном случае, если значения имеют один и тот же тип и не являются числами, они считаются равными, если имеют одинаковое значение. Наконец, если оба значения являются числами, они считаются равными, если они оба не 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


Свободное равенство с использованием ==

Свободное равенство сравнивает два значения на равенство после преобразования обоих значений в общий тип. После преобразований (одна или обе стороны могут быть преобразованы) окончательное сравнение на равенство выполняется точно так же, как это делает ===. Свободное равенство симметрично: A == B всегда имеет семантику, идентичную B == A для любых значений A и B (за исключением порядка применяемых преобразований).

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

// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
person Alireza    schedule 07.05.2017
comment
Я действительно считаю, что это субъективно в отношении того, что вы должны / не должны делать, и вводить в заблуждение, когда кто-то всегда использует определенное действие. Хотя я согласен с тем, что в большинстве случаев мы предпочитаем использовать '===' вместо '==', может быть особый случай, когда вы хотите, чтобы преобразование типа было выполнено. - Я не могу придумать точный вариант использования, но, возможно, дизайн должен иметь некоторую неполную проверку. В любом случае, если что-то и включено в язык, значит, на это есть причина. На мой взгляд, нам следует избегать общих заявлений о том, что «всегда делай х». - person SeanRamzan; 18.05.2017
comment
Я почти согласен с вами, если вы прочитаете мой ответ полностью, вы видите, что я объясню более подробно позже, честно говоря, мы не так много случаев используем и нуждаемся в свободном сравнении в Javascript ... Я могу сказать, что менее 5 процентов , даже намного меньше, но я использую «всегда» для тех людей без фона js, которые думают == проверяют строгое сравнение в JavaScript, они учатся быть терпеливыми и не используют его в первую очередь, но по мере того, как они становятся более опытными, они знать, в каких редких случаях они могут его использовать. Вот почему я так пишу свой ответ. - person Alireza; 18.05.2017

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Увидел это в одном из ответов. a и b в этом случае не являются одним и тем же типом. Если вы отметите typeof(a), вы получите 'object', а typeof(b) будет 'string'.

person Orri Scott    schedule 05.07.2016