Почему («foo» === new String («foo»)) имеет значение false в JavaScript?

Я собирался начать использовать === (тройное равенство, строгое сравнение) все время при сравнении строковых значений, но теперь я обнаружил, что

"foo" === new String("foo")

ложно, и то же самое с этим:

var f = "foo", g = new String("foo");
f === g; // false

Конечно:

f == g; // true

Так что рекомендуется всегда использовать == для сравнения строк или всегда преобразовывать переменные в строки перед сравнением?

 Danilo Valente08 июн. 2012 г., 17:40
Может быть, потому, чтоfoo это чистая строка иnew String("foo") это строка объекта
 Robert Koritnik08 июн. 2012 г., 17:42
Почему кто-то хочет использовать конструкцию какnew String("foo") в Javascript на первом месте? Я никогда не видел такого кода в коде, то есть jQuery ...
 Pekka 웃08 июн. 2012 г., 17:40
 Esailija08 июн. 2012 г., 17:41
Рекомендуется не создавать строки сnew String (Совершенно бессмысленно) вместо использования==
 Michael Butler08 июн. 2012 г., 17:57
Итак, если я разрабатываю библиотеку JS для использования в другом месте, я могу предположить и потребовать, чтобы функция принимала параметр как примитивную строку, и если пользователь API передает объект String (), я могу предположить, что это неправильное использование API

Ответы на вопрос(5)

===,

an Object is never equal to anything except another reference to itself.

a primitive is equal when compared to another primitive if their type and value are the same.

 08 июн. 2012 г., 17:43
@Rocket: должно быть, поскольку они представляют собой две разные ссылки ...
 08 июн. 2012 г., 17:41
@Rocket: Точно моя точка зрения.
 08 июн. 2012 г., 17:41
new String("foo") === new String("foo") являетсяfalse :-П
Решение Вопроса

"foo" это строкаprimitive, (эта концепция не существует в C # или Java)

new String("foo") это строковый объект в штучной упаковке.

=== операторведет себя по-разному на примитивах и объектах.
При сравнении примитивов (одного типа)=== вернет true, если они оба имеют одинаковое значение.

При сравнении объектов,=== вернет true, только если они ссылаются на один и тот же объект (сравнение по ссылке). Таким образом,new String("a") !== new String("a").

В твоем случае,=== возвращает false, потому что операнды имеют разные типы (один является примитивом, а другой - объектом).

Примитивы вообще не являются объектами.
typeof оператор не вернется"object" для примитивов.

Когда вы пытаетесь получить доступ к свойству примитива (используя его как объект), язык Javascript будет привязывать его к объекту, каждый раз создавая новый объект. Это описано вСпецификация.

Вот почему вы не можете поместить свойства в примитивы:

var x = "a";
x.property = 2;
alert(x.property) //undefined

Каждый раз, когда вы пишетеx.property,different в штучной упаковкеString объект создан.

 30 июл. 2012 г., 22:01
У Java есть примитивы / .Net don 't
 08 июн. 2012 г., 17:51
if( Object(a) !== a ) { //it's a primitive }
 08 июн. 2012 г., 17:43
Интересно, я думал, что строки были объектами в JS.
 08 июн. 2012 г., 17:40
+1 typeof "foo"; // "string", typeof new String("foo"); // "object"
 08 июн. 2012 г., 17:47
@Sarfraz: почти все. Не забывайте оnull а такжеundefined.

new слово криминальное тут (as usualпозвольте сказать) ...

Когда вы используетеnewВы явно выражаете свое желание работать сobject, Это может быть удивительно для вас, но это:

var x = new String('foo');
var y = new String('foo');
x === y; 

... даст вам могучийfalse, Все просто: сравниваются не объекты внутренности, но объекты & apos; Рекомендации. И они, конечно, не равны, так как были созданы два разных объекта.

Что вы, вероятно, хотите использоватьconversion:

var x = String('foo');
var y = String('foo');
x === y;

... и это даст вам, как и ожидалось,true в результате вы можете радоваться и процветать с равнымиfoos навсегда. )

 Michael Butler08 июн. 2012 г., 23:03
быстрый вопрос об использовании этого. Вы вызываете String (конструктор?) Без «нового»; ключевое слово. Не означает ли это, что вы будете загрязнять область действия какими-либо свойствами, назначенными в String co, nstructor? Или этого не происходит, потому что конструктор является нативным кодом? Другими словами, предположим, что функция String содержит «this.a = 1;» - это означает, что ваша функция / объект теперь будет иметь свойство a = 1.
 09 июн. 2012 г., 01:26
Я полагаю (но не могу сказать наверняка) каждый из «конструкторов бокса» Сначала функция проверяет свой контекст, и если он не является «новым». (т.е. объект-прототип), сразу переключается на метод преобразования. В случае строки это будетtoString() метод, например.

> "foo" === (new String("foo")).valueOf()
true
> "foo" === new String("foo")
false
> typeof("foo")
'string'
> typeof(new String("foo"))
'object'
> typeof((new String("foo")).valueOf())
'string'

foo это чистая строка иnew String("foo") это строка объекта

Ваш ответ на вопрос