Это просто сильно ударил меня. Я не знаю, относится ли это ко всем браузерам (у меня нет другого компетентного браузера для тестирования), но по крайней мере у Firefox есть два типа строковых объектов.
Откройте консоль Firebugs и попробуйте следующее:
>>> "a"
"a"
>>> new String("a")
String { 0="a"}
Как вы можете визуально наблюдать, Firefox рассматривает new String("a")
и "a"
по-разному. В противном случае, оба типа строк, похоже, ведут себя одинаково. Например, есть доказательства того, что оба используют один и тот же объект-прототип:
>>> String.prototype.log = function() { console.log("Logged string: " + this); }
function()
>>> "hello world".log()
Logged string: hello world
>>> new String("hello world").log()
Logged string: hello world
Таким образом, очевидно, что оба они одинаковы. То есть, пока вы не попросите тип.
>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"
Мы также можем заметить, что когда this
является строкой, она всегда является формой объекта:
>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}
Идя немного дальше, мы видим, что представление объекта без объекта не поддерживает никаких дополнительных свойств, но строка объекта:
>>> var a = "a"
>>> var b = new String("b")
>>> a.bar = 4
4
>>> b.bar = 4
4
>>> a.bar
undefined
>>> b.bar
4
Кроме того, забавный факт! Вы можете превратить строковый объект в строку без объекта с помощью функции toString()
:
>>> new String("foo").toString()
"foo"
Никогда не думал, что было бы полезно позвонить String.toString()
! В любом случае.
Итак, все эти эксперименты задают вопрос: почему существуют два типа строк в JavaScript?
Комментарии показывают, что это также относится к каждому примитивному JavaScript-типу (номера и bools включены).