"foo"
является строковым примитивом . (этой концепции нет в C # или Java)
new String("foo")
- строковый объект в рамке.
===
Оператор ведет себя по- разному на примитивы и объекты .
При сравнении примитивов (одного типа) ===
вернет истину, если они оба имеют одинаковое значение.
При сравнении объектов ===
вернет истину, только если они относятся к одному и тому же объекту (сравнение по ссылке). Таким образом, new String("a") !== new String("a")
.
В вашем случае ===
возвращает false, потому что операнды имеют разные типы (один - примитив, а другой - объект).
Примитивы вообще не объекты. Оператор не вернется
typeof
"object"
примитивов .
Когда вы пытаетесь получить доступ к свойству примитива (используя его как объект), язык Javascript помещает его в объект, создавая каждый раз новый объект. Это описано в спецификации .
Вот почему вы не можете добавлять свойства к примитивам:
var x = "a";
x.property = 2;
alert(x.property) //undefined
Каждый раз , когда вы пишете x.property
, разные коробочный String
объект создается.
foo
это чистая строка, аnew String("foo")
это строка объекта