Подтвердить что ты не робот

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

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

new String('hello') === new String('hello')
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Строгое сравнение двух объектов - ложный не тот же объект

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

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

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

Ответ 3

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

Связанное сообщение: Что такое ключевое слово 'new' в JavaScript? Это объясняет в своем (обширном) ответе:

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

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

Ответ 4

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

Итак, скажем, у меня есть листок бумаги со словом "Hello World", написанным на нем (Paper1), и у моего брата есть другой лист бумаги со словом "Hello World", написанным на нем (Paper2),

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

истинно.

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

Ответ 7

Ваш код по существу говорит: "Возьмите лист бумаги и напишите" привет "на нем. Возьмите еще один лист бумаги и напишите" привет "на этом. Являются ли они одним и тем же листом бумаги?"