Почему следующий оператор возвращает false в JavaScript?
new String('hello') === new String('hello')
Почему следующий оператор возвращает false в JavaScript?
new String('hello') === new String('hello')
Два объекта 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')
Строгое сравнение двух строк - true, одинаковое возвращаемое значение и один возвращаемый тип
String('hello') === String('hello')
Он вычисляет false, потому что вы сравниваете два разных объекта: new создаст новый объект.
Связанное сообщение: Что такое ключевое слово 'new' в JavaScript? Это объясняет в своем (обширном) ответе:
Это [новое] - это 4 вещи:
- Создает новый объект. Тип этого объекта - просто объект.
- Он устанавливает этот новый объект как внутреннее, недоступное, [[prototype]] свойство как функцию конструктора, внешнюю, доступную, prototype object (каждый объект функции автоматически имеет свойство прототипа).
- Он выполняет функцию конструктора, используя вновь созданный объект, когда упоминается
this
.- Он возвращает вновь созданный объект, если функция-конструктор не возвращает не-примитивное значение. В этом случае будет возвращено не-примитивное значение.
Вы запрашиваете javascript для сравнения двух разных экземпляров переменной, а не строкового значения, которое находится внутри переменной.
Итак, скажем, у меня есть листок бумаги со словом "Hello World", написанным на нем (Paper1), и у моего брата есть другой лист бумаги со словом "Hello World", написанным на нем (Paper2),
Когда вы говорите, что Paper1 === Paper2 вы получите false, beacuse no, они не являются одним и тем же листом бумаги, хотя слова, написанные на бумаге, одинаковы.
Если вы скажете 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 литеральных объекта (как мой первый пример), сделав цикл на этих объектах, и когда вы найдете разницу, вы знаете результат. Сложнее сделать этот трюк в инстанцированном объекте, сравнить 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, прекрасно объясняет, что нового делает, надеюсь, что это поможет.
Ваш код по существу говорит: "Возьмите лист бумаги и напишите" привет "на нем. Возьмите еще один лист бумаги и напишите" привет "на этом. Являются ли они одним и тем же листом бумаги?"