JavaScript中的字符串有很多方法,比如:检索字符串的位置、获取某一个字符等。
var str = 'hello'; var firstChar = str.charAt(0); console.log(firstChar) // 'h'
有的人就会因此误认为,字符串就是对象,毕竟“万物皆对象”嘛。
但其实不然。这篇文章就来证明一下。
当读取字符串时,原始封装类型将被自动创建。
我们来看上面代码背后发生了什么:
var str = 'hello'; var temp = new String(str); var firstChar = temp.charAt(0); temp = null; console.log(firstChar); // 'h'
因为str.charAt(0)把字符串当成对象来用了,js引擎创建了一个临时的字符串对象让charAt(0)可以工作。
该字符串对象的存在仅用于该语句并在随后被销毁。
之前说了,字符串不是真正的对象,为了测试这一点,试着给字符串添加一个属性看看它是不是对象。
var str = 'hello'; str.name = 'curry'; console.log(str.name); // undefined
它要真是正儿八经对象的话结果应该是'curry'而不是undefined。
下面是JS引擎中实际发生的事情:
var str = 'hello'; var temp = new String(str); temp.name = 'curry'; temp = null; var temp = new String(str); console.log(temp.last); // undefined temp = null;
实际上是在一个立刻就被销毁的临时对象上而不是字符串上添加了新的属性。
之后,当试图访问这个属性时,另一个不同的临时对象被创建,而那个新属性是不存在的。