Чому ==
це так непередбачувано?
Що ви отримуєте, коли порівнюєте порожній рядок ""
із числом нуль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**
І це просто шалені речі, які ви отримуєте з примітивами.
Це абсолютно новий рівень божевільних, коли ви використовуєте ==
з предметами.
У цей момент ваше, напевно, цікаво ...
Чому це відбувається?
Ну тому, що на відміну від "потрійних рівних" ( ===
), які просто перевіряють, чи є два значення однаковими.
==
робить цілу купу інших речей .
У ньому є спеціальна обробка для функцій, спеціальна обробка для нулів, невизначені, рядки, ви її називаєте.
Це стає досить дурним.
Насправді, якби ви намагалися написати функцію, яка робить те, що ==
робить, це виглядало б приблизно так:
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();
}
То що це означає?
Це означає ==
, що складно.
Оскільки це складно, важко зрозуміти, що буде, коли ви його будете використовувати.
Що означає, що у вас можуть виникнути помилки.
Тож мораль історії ...
Зробіть ваше життя менш складним.
Використовуйте ===
замість==
.
Кінець.
=== vs ==
, але в PHP, можна прочитати тут: stackoverflow.com/questions/2401478/why-is-faster-than-in-php / ...