Операторы сравнения JavaScript: идентичность и равенство - PullRequest
18 голосов
/ 27 марта 2011

Я пытался понять разницу между операторами сравнения JavaScript: идентичность и равенство.Из того, что я прочитал, если вы проверите равенство двух объектов с помощью ==, JavaScript попытается выяснить, относятся ли они к одному типу, и, если нет, попытается привести их к тому же типу.Однако === не ведет себя так же.В качестве примера:

var n = "1";
console.log(n==1);        // outputs true
console.log(n===1);       // outputs false

Так в чем же разница между этими «единичными» операторами и операторами регулярного равенства?Какая польза от обоих?

Есть ли различия в производительности?Я думаю, что оператор идентификации будет быстрее, поскольку он не выполняет преобразование.

Кроме того, как они отличаются, когда речь идет о более сложных объектах, таких как массивы?Самое главное, о чем говорят конвенции, когда одно следует использовать поверх другого, почему?

Ответы [ 4 ]

29 голосов
/ 27 марта 2011

Оператор равенства попытается сделать типы данных одинаковыми перед выполнением сравнения. С другой стороны, оператор идентификации требует, чтобы оба типа данных были одинаковыми в качестве предварительного условия.

Существует довольно много других сообщений, похожих на эти вопросы. См:

Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)? (имеет хорошую сравнительную таблицу)
Какой оператор равенства (== vs ===) следует использовать в сравнениях JavaScript?

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

1 == true     => true
true == true  => true
1 === true    => false
true === true => true
16 голосов
/ 27 марта 2011

Разница в том, что ==, <=,> = и! = Приведут к приведению типов & mdash; например, заставить строку быть оцененной как число. ===, <==,> == и! == не приведут к принуждению типов. Они будут сравнивать строку с числом, и, поскольку строка «1» не совпадает с числовым значением 1, результат равен false.

Ссылка здесь:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators

10 голосов
/ 09 августа 2016

== - это то же самое, что и ===, за исключением того, что == выполняет преобразование типов

Чтобы показать вам, что я имею в виду, есть функция JavaScript, которая ведет себя точно так же, как ==:

// loseEqual() behaves just like `==`
function loseEqual(x, y) {
    // notice the function only uses "strict" operators 
    // like `===` and `!==` to do comparisons

    if(typeof y === typeof x) return y === x;

    if(typeof y === "function" || typeof x === "function") return false;

    // 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 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;

    return x === y;
}

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

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

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

Вот несколько примеров результатов, которые вы не ожидаете:

Неожиданные истины

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

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

Неожиданные выводы

// IF an empty string '' is equal to the number zero (0)
'' == 0 // return true

// AND the string zero '0' is equal to the number zero (0)
'0' == 0 // return true

// THEN an empty string must be equal to the string zero '0'
'' == '0' // returns **FALSE**

Объекты со специальными функциями

// Below are examples of objects that
// implement `valueOf()` and `toString()`

var objTest = {
    toString: function() {
        return "test";
    }
};

var obj100 = {
    valueOf: function() {
        return 100;
    }
};

var objTest100 = {
    toString: function() {
        return "test";
    },
    valueOf: function() {
        return 100;
    }
};

objTest == "test" // returns true
obj100 == 100 // returns true
objTest100 == 100 // returns true

objTest100 == "test" // returns **FALSE**
1 голос
/ 22 октября 2015

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

Более четкое объяснение по следующей ссылке:

https://medium.com/@ludico8/identity-vs-equality-battle-of-understanding-vs-758d396e922#.hhg396ey9

...