Почему ==
это так непредсказуемо?
Что вы получаете, когда сравниваете пустую строку ""
с нулевым числом 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/…