Я собирался начать использовать === (тройное равенство, строгое сравнение) все время при сравнении строковых значений, но теперь я обнаружил, что
"foo" === new String("foo")
ложно, и то же самое с этим:
var f = "foo", g = new String("foo");
f === g; // false
Конечно:
f == g; // true
Итак, рекомендуется ли всегда использовать == для сравнения строк или всегда преобразовывать переменные в строки перед сравнением?
javascript
object
equality
Майкл Батлер
источник
источник
foo
это чистая строка, аnew String("foo")
это строка объектаnew String
(Совершенно бессмысленно) вместо использования==
new String("foo")
Javascript? Я никогда не видел такого кода в коде, например, jQuery ...String(obj)
для преобразования строки в рамке в примитив после того, как вы получили свой "строковый" параметр.("foo" === String(new String("foo"))) === true
Ответы:
"foo"
является строковым примитивом . (этой концепции нет в C # или Java)new String("foo")
- строковый объект в рамке.===
Оператор ведет себя по- разному на примитивы и объекты .При сравнении примитивов (одного типа)
===
вернет истину, если они оба имеют одинаковое значение.При сравнении объектов
===
вернет истину, только если они относятся к одному и тому же объекту (сравнение по ссылке). Таким образом,new String("a") !== new String("a")
.В вашем случае
===
возвращает false, потому что операнды имеют разные типы (один - примитив, а другой - объект).Примитивы вообще не объекты. Оператор не вернется
typeof
"object"
примитивов .Когда вы пытаетесь получить доступ к свойству примитива (используя его как объект), язык Javascript помещает его в объект, создавая каждый раз новый объект. Это описано в спецификации .
Вот почему вы не можете добавлять свойства к примитивам:
Каждый раз , когда вы пишете
x.property
, разные коробочныйString
объект создается.источник
typeof "foo"; // "string"
,typeof new String("foo"); // "object"
null
иundefined
.if( Object(a) !== a ) { //it's a primitive }
Используя
===
,Объект никогда не равен ничему, кроме другой ссылки на себя.
примитив равен по сравнению с другим примитивом, если их тип и значение совпадают.
источник
new String("foo") === new String("foo")
являетсяfalse
:-Pnew
Слово преступник здесь ( как обычно , я могу сказать) ...Когда вы используете
new
, вы явно выражаете свое желание работать с объектом . Это может вас удивить, но вот это:... даст вам могущественный
false
. Все просто: сравниваются не внутренности объектов, а ссылки на объекты. И они, конечно, не равны, так как были созданы два разных объекта.Вероятно, вы захотите использовать преобразование :
... и это даст вам, как и ожидалось,
true
результат, так что вы сможетеfoos
вечно радоваться и процветать вместе со своими равными . )источник
toString()
Например, в случае String это будет метод.foo
это чистая строка иnew String("foo")
объектная строкаисточник
Из REPL node.js ("узел" в командной строке, если он установлен):
источник