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,

Другие вопросы по тегам