Celui-ci m'a poignardé dur. Je ne sais pas si c'est le cas avec tous les navigateurs (je n'ai pas d'autres compétente navigateur afin de le tester), mais au moins, Firefox a deux types d'objets string.
Ouvrir le Firebugs console et essayez ce qui suit:
>>> "a"
"a"
>>> new String("a")
String { 0="a"}
Comme vous pouvez l'observer, Firefox friandises new String("a")
et "a"
différemment. Sinon, toutefois, les deux types de chaînes semblent se comporter de la même. Il est, par exemple, la preuve que les deux utilisent le même prototype de l'objet:
>>> 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
Donc, apparemment, les deux sont les mêmes. C'est, jusqu'à ce que vous demandez pour le type.
>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"
On peut aussi remarquer que lors de l' this
est une chaîne de caractères, il est toujours l'objet de formulaire:
>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}
Pour aller un peu plus loin, nous pouvons voir que le non-objet de représentation de chaîne ne prend pas en charge toutes les propriétés supplémentaires, mais l'objet chaîne n':
>>> var a = "a"
>>> var b = new String("b")
>>> a.bar = 4
4
>>> b.bar = 4
4
>>> a.bar
undefined
>>> b.bar
4
Aussi, fait amusant! Vous pouvez activer un objet de type string dans un non-objet string à l'aide de l' toString()
fonction de:
>>> new String("foo").toString()
"foo"
Jamais pensé qu'il pourrait être utile de communiquer String.toString()
! De toute façon.
Donc, toutes ces expériences soulèvent la question: pourquoi il y a deux types de chaînes de caractères en JavaScript?
Les commentaires montrent que cela est également le cas pour toutes les primitives JavaScript type (nombre et bool inclus).