JavaScript равных операций аномалии
Я работаю над лекцией о сложном для понимания коде JavaScript и, конечно, о слабом месте JavaScript является знание того, что вернет == / ===. Я нашел этот великолепный ответ в стеке, который хорошо охватывает эту тему - Какой оператор равенства (== vs ===) должен использоваться в сравнениях JavaScript?
одна вещь, которая привлекла мое внимание (вероятно, потому что я не знал об этом до сих пор), была то, что вы можете использовать String Objects вместо примитивов, и вы получите другой результат в ваших условиях -
"abc" == new String("abc") // true
"abc" === new String("abc") // false
Я хотел проверить это и обнаружил несколько не очень интуитивных результатов, используя String Objects -
new String("abc") === new String("abc") // false
и даже
new String("abc") == new String("abc") // false
Вначале я думал, что это ошибка браузера, но я тестировал ее как на Chrome, так и на Firefox. Поэтому я был бы очень рад, если бы кто-то мог поделиться дополнительной информацией, как может быть так, что сравнение литеральной строки и строкового объекта будет правдой, но сравнение двух "равных" строковых объектов будет ложным
1 ответ
сравнивать два "равных" строковых объекта будет ошибочно
Я выделил важное слово выше. Две ссылки на объекты никогда не равны друг другу, если они не ссылаются на один и тот же объект.
Вы создаете два новых экземпляра String
, Это два отдельных объекта, даже если они имеют одинаковое строковое значение.
var s1 = new String("abc"),
s2 = new String("abc");
s1 === s1; // true
s1 === s2; // false
Это обобщено в спецификации следующей строкой как алгоритма абстрактного равенства, так и алгоритма строгого равенства:
Вернуть
true
если x и y относятся к одному и тому же объекту. В противном случае вернутьfalse
,