Почему 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 вещи:
- Это создает новый объект. Тип этого объекта - просто объект.
- Он устанавливает внутреннее недоступное свойство [[prototype]] этого нового объекта как внешний, доступный, объект- прототип функции конструктора (каждый объект функции автоматически имеет свойство prototype).
- Он выполняет функцию конструктора, используя вновь созданный объект всякий раз, когда
this
упомянуто.- Он возвращает вновь созданный объект, если функция конструктора не возвращает не примитивное значение. В этом случае это не примитивное значение будет возвращено.
Вы просите 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, прекрасно объясняет, что делают новые, надеюсь, это поможет.