// 请比较下面的
var hi = "hello"
hi == String("hello") // true
hi === String("hello") // true
hi == new String("hello") // true
hi === new String("hello") // false construct a String object explicitly to avoid auto-boxing
The following syntax with the new operator will throw a TypeError:
var sym = new Symbol(); // TypeError
This prevents authors from creating an explicit Symbol wrapper object instead of a new symbol value. Creating an explicit wrapper object around primitive data types is no longer supported starting with ECMAScript 6. However, existing primitive wrapper objects like new Boolean, new String and new Number can still be created for legacy reasons.
And if you really want to create a Symbol wrapper object, you can use the Object() function:
var sym = Symbol("foo");
typeof sym; // "symbol"
var symObj = Object(sym);
typeof symObj; // "object"
在javascript中(目前)有6中
primitive data type
, 分别是:null
,undefined
,String
,Number
,Boolean
,Symbol
;除了
null
,undefined
没有经过自动包装(auto-boxing)外,其余的类型在javascript中都是经过包装后使用的. 都有自己的包装对象(primitive wrapper objects)既然
primitive
是不可以修改的,没有方法的; 那么为什么javascript中的String就有方法呢,比如substr()?发现在js中字面量写的"hello"都是直接使用String构造方法自动包装. 注意使用
new
时和没有使用new
时的区别. (区别就是内存地址不同,凡是使用new开辟的都是新的内存地址) 没有使用new
, 即相同的字符串共用一块内存地址 使用new
, 即使是相同的字符串,也会开辟出一块新的内存地址.注意 在ES6 以及以后, 将不再推荐使用new 来创建包装对象了: 就是
Symbol
类型不能使用new
来显示的And if you really want to create a Symbol wrapper object, you can use the Object() function: