前六种基础数据类型是 undefined null Boolean String Number Object
Symbol 值通过Symbol函数生成 可以接受一个字符串作为参数,主要为了区分不同Symbol值
参数若是一个对象,则会调用该对象的 toString 方法转成字符串 传递给Symbol
参数只做为一个描述存在,同样的参数生成的Symbol也不相等不能用 new 创建
围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。然而,现有的原始包装器对象,如 new Boolean、new String以及new Number,因为遗留原因仍可被创建。
let s1 = Symbol('foo');
let s2 = Symbol('bar');
let s3 = Symbol('bar');
console.log(s1); // Symbol(foo)console.log(typeof s1); // symbolconsole.log(String(s2)); // "Symbol(bar)" 不能用new Stringconsole.log(Boolean(s2)); // trueconsole.log(Number(s2)); // 报错 TypeError: Cannot convert a Symbol value to a numberconsole.log(s2 === s3); //falseconsole.log(s3.description); //"bar" (ES2019)
let obj1 = {
a: 12
};
let obj2 = {
a: 12,
toString() {}
};
let obj3 = {
a: 12,
toString() {
returnthis.a;
}
};
let s4 = Symbol(obj1);
let s5 = Symbol(obj2);
let s6 = Symbol(obj3);
console.log(s4); //Symbol([object Object])console.log(s5); //Symbol(undefined)console.log(s6); //Symbol(12)
classMyArrayextendsArray{
// 覆盖 species 到父级的 Array 构造函数上static get [Symbol.species]() { returnArray; }
}
let a = new MyArray(1,2,3);
let mapped = a.map(x => x * x);
console.log(mapped instanceof MyArray); // falseconsole.log(mapped instanceofArray); // true