Почему new String('hello') === new String('hello') оценивается как False?

Почему следующее утверждение возвращает false в JavaScript?

new String('hello') === new String('hello')

7 ответов

Два объекта String всегда будут неравны друг другу. Обратите внимание, что JavaScript имеет строковые примитивы, а также конструктор String для создания объектов-оболочек. Все сравнения объектов (особенно с ===) проводятся в качестве теста на равенство эталонов. Ссылки на два разных объекта, конечно, никогда не будут равны друг другу.

Так "hello" === "hello" будет true потому что это строковые примитивы.

Вы сравниваете экземпляры объектов, что не похоже на сравнение строк ('hello' === 'hello') Сравнение объектов в Javascript фактически сравнивает адреса памяти объектов и всегда возвращает false, потому что адреса памяти различны для каждого объекта.

Сравните строковые значения вместо экземпляра объекта - jsFiddle

( String('hello') === String('hello') ) // returns true due to comparing strings

Строго сравнивая два объекта - ложь не один и тот же объект

new String('hello') === new String('hello')

Строгое сравнение двух строк - истина, одинаковое возвращаемое значение и одинаковый возвращаемый тип

String('hello') === String('hello')

Он оценивается как ложный, потому что вы сравниваете два разных объекта: новый создаст новый объект.

Связанный пост: Что такое "новое" ключевое слово в JavaScript? Что объясняет в (широком) ответе:

Это [новый] это 4 вещи:

  1. Это создает новый объект. Тип этого объекта - просто объект.
  2. Он устанавливает внутреннее недоступное свойство [[prototype]] этого нового объекта как внешний, доступный, объект- прототип функции конструктора (каждый объект функции автоматически имеет свойство prototype).
  3. Он выполняет функцию конструктора, используя вновь созданный объект всякий раз, когда this упомянуто.
  4. Он возвращает вновь созданный объект, если функция конструктора не возвращает не примитивное значение. В этом случае это не примитивное значение будет возвращено.

Вы просите JavaScript сравнить два разных экземпляра переменной, а не строковое значение, которое находится внутри переменной.

Например, предположим, у меня есть лист бумаги с надписью "Hello World" (Paper1), а у моего брата другой лист бумаги с надписью "Hello World" (Paper2).

Когда вы говорите "Paper1 === Paper2", вы получите ложь, потому что нет, это не совсем один и тот же лист бумаги, хотя слова, написанные на бумаге, одинаковы.

Если вы скажете "Paper1.toString() === Paper2 .toString()", вы получите истинное значение, поскольку мы сравниваем слова, написанные на бумаге, а не сам документ.

typeof(new String()) === 'object';
==> true

(new Object()) === (new Object());
==> false

Любая "объектная" структура в " куче" уникальна;

Куча против стека

По сути, ваш код гласит: "Возьми лист бумаги и напиши на нем" привет ". Возьми другой листок бумаги и напиши на нем" привет ". Это один и тот же лист бумаги?"

Также, если вы делаете if ( { hello: 1 } === { hello: 1 }){ console.log( "yay"); } console.log никогда не происходит, потому что это объект.

Вы можете сравнить 2 буквальных объекта (как мой первый пример), создав цикл для этих объектов, и когда вы найдете разницу, вы узнаете результат. Сложнее сделать этот трюк в инстанцированном объекте, сравнить две функции - это безумие.

Но если JavaScript не делает это за вас, это потому, что это очень тяжело, вы должны проверить каждый тип каждого атрибута, чтобы привести его в соответствие, если это функция и т. Д. И, очевидно, это бесполезно.

Вы можете использовать instanceof, если хотите проверить "происхождение" 2 объектов, потому что typeof вернет вам "объект". И для тестирования 2 объекта "новая строка" вы должны использовать toString new String( "hello").toString() == new String( "hello").toString() или если вы хотите проверить объект без проверки атрибутов new String ("hello") экземпляр String && new String( "hello") экземпляр String

правда.

Ссылка, предоставленная BeyelerStudios, прекрасно объясняет, что делают новые, надеюсь, это поможет.

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