"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")это строка объекта