一、什么是Symbol
ES6中,为了解决对象中属性名冲突的问题,出现了新的基本数据类型—Symbol。它用于创建唯一且不可变的标识符,通常用作对象属性的名称。下文将对Symbol类型进行基础的讲解。
二、Symbol的特点
1.Symbol是基本数据类型
var sy1=Symbol(); //这是声明symbol变量的方式。括号内参数为key值
console.log(sy1);
console.log(typeof sy1);
可以看到,Symbol类型的变量sy1的数据类型是symbol,它虽然通过方法声明,但的确是基本数据类型中的一种。引用类型的typeof返回值一般为object。(函数除外,为function)
2.Symbol所声明的变量是独一无二的
在其他基本数据类型中,属性值相同时,可以判断两个变量是相等的,但是Symbol数据类型并非如此。这是因为Symbol所声明的变量是独一无二的。
var a=10;
var b=10;
console.log(a==b);
var sy1=Symbol('a');
var sy2=Symbol('a');
console.log(sy1==sy2);
三、对象中的Symbol
开头提到。Symbol的初衷是为了解决对象中属性名冲突的问题,下面举例来说声是如何实现的。
let obj={
a:1,
b:2,
c:3,
a:2
}
console.log(obj); //{a: 2, b: 2, c: 3}
一般情况下,对象中属性名冲突时,会发生覆盖。那么属性名为唯一值时,可避免这个问题。需要先在对象外部定义唯一值变量,否则会报错未定义。
var a=Symbol();
let obj={
a:1,
b:2,
c:3,
[a]:2
}
console.log(obj); //{a: 1, b: 2, c: 3, Symbol(): 2}
四、Symbol类型常用的方法
1.Object.getOwnPropertySymbols()
常用的for in,Object.keys等方法是无法遍历到对象中唯一值属性的。Object.getOwnPropertySymbols()方法用来获取对象中唯一值属性,但仅能获取唯一值属性,其他的属性也是获取不到的。
var a = Symbol('a')
var b = Symbol('b')
let obj = {
a: 1,
b: 2,
c: 3,
[a]: 2,
[b]: 3
}
for (x in obj) {
console.log(`${x}:${obj[x]}`)
}
console.log(Object.keys(obj));
console.log(Object.getOwnPropertySymbols(obj))
2.Reflect.ownKeys()
Reflect.ownKeys()是很重要的一个方法,它可以获取对象中的所有属性。
var a = Symbol('a')
var b = Symbol('b')
let obj = {
a: 1,
b: 2,
c: 3,
[a]: 2,
[b]: 3
}
console.log(Reflect.ownKeys(obj));
3.Symbol.for()
根据参数名,去全局环境中搜索是否有以该symbol.for()参数为名的symbol值,有就返回它,没有就以该参数名来创建一个新的symbol值。
console.log(a1); //undefined
var a1 = Symbol.for('a');
console.log(a1); //Symbol(a)
4.Symbol.Keyfor()
返回一个以被登记在全局环境中的symbol.for()值的key,没有就返回undefined。
let a_1 = Symbol.for('b');
let a = Symbol('a');
console.log(Symbol.keyFor(a_1)); //b
console.log(Symbol.keyFor(a)); //undefined