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