ES6–Symbol类型
ES5中包含5种原始类型:字符串(string)、数字(number)、布尔值(boolean)、null和undefined。ES6中引入了第6种原始类型——Symbol。
Symbol:表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
1、基本用法
symbol 值通过symbol函数生成。
let s1 = Symbol();//创建了一个symbol的实例
console.log(s1);//Symbol()
console.log(typeof s1);//symbol
symbol函数也可以传递一个字符串参数,参数作用是对symbol类型的描述,便于区分这个symbol是哪一个。
let s1 = Symbol("symbol");
console.log(s1);//Symbol(symbol)
console.log(typeof s1);//symbol
symbol类型的值具有唯一性,是一个独一无二的值,每一个 Symbol 的值都不相等。相同参数 Symbol() 返回的值不相等。
let s1 = Symbol("symbol");
let s2 = Symbol("symbol");
console.dir(s1 == s2);//false
2、使用场景
// 定义一个对象
let symbol=Symbol('address'); // 指定属性名
let obj={name:'jack',age:10};
// 假如我们要向对象里额外加个属性
// obj.address='伏虎路' // 以前的写法,不过假如属性很多的时候,可能会出现属性重复
obj[symbol]='伏虎路' // 这样能保证属性不重复
console.log(obj)
symbol类型的值具有唯一性,由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。
let n = Symbol("uname");
let n2 = Symbol("uname");
let obj1 = {};
obj1[n] = "jack";
obj1[n2] = "rose";
console.log(obj1);//{Symbol(uname): "jack", Symbol(uname): "rose"}
3、配置底层的实现原理
- Symbol.hasInstance 影响instanceof运算符的结果
function A(){}
Object.defineProperty(A,Symbol.hasInstance,{
value : function(v){
console.log(v) //A{}
return false
}
})
const a = new A()
console.log(a instanceof A) //false
- Symbol.isConcatSpreadable 会对数组concat方法产生影响
const arr =[3]
const arr2 = [4,5,6,7];
arr2[Symbol.isConcatSpreadable] = false;
const result = arr.concat(99,arr2)
console.log(result) // [3, 99, Array(4)]
- Symbol.toPrimitive 对数据类型的转换产生影响
const obj = {
a : 1,
b : 2
}
obj[Symbol.toPrimitive] = function(){
return 123
}
console.log(obj + 123) //246
- Symbol.toStringTag 可以影响Object.prototype.toString的返回值
class Person{
[Symbol.toStringTag] = "Person"
}
const p = new Person()
console.log(p) //Person {Symbol(Symbol.toStringTag): 'Person'}
console.log(Object.prototype.toString.call(p)) //[object Person]