在 JavaScript 中,有三种声明字符串的形式:
var str = "string"
var str2 = String("string")
var str3 = new String("string")
第一种和第二种是相同的。第三种严格意义上讲不算是声明字符串,而是使用 String 生成一个 object 。
String
可以看一下 MDN 对 String 的定义:https://developer.mozilla.org/cn/docs/Web/JavaScript/Reference/Global_Objects/String
String 全局对象是一个用于字符串或一个字符序列的构造函数。
可以看到,String 的本质是一个函数。String(thing) 将 thing 变成一个字符串并返回。
new String
要想弄明白 new String 到底做了什么工作,就要先明白 JavaScript 的 new 运算符做了哪些事情:
- 创建了一个新的对象,对象类型为
object; - 设置这个新的对象的内部、可访问性和
[[prototype]]属性为构造函数(指prototype.construtor所指向的构造函数)中设置的; - 执行构造函数,当
this关键字被提及的时候,使用新创建的对象的属性; - 返回新创建的对象。
new String 生成了一个完整的 object ,并不是一个字符串。
=== & typeof
明白了以上两点,就很好解释 String 与 new String 的区别了。对于文章开头出现的代码,我们能得到以下的结果。
str === str2 // true
str === str3 // false
typeof str // string
typeof str3 // object