Symbol学习
在 JavaScript 有6中数据类型,分别是:String字符串类型;Number数字类型;Object对象类型;Boolean布尔值类型;Null空值;Undefined 未定义;
Symbol是ES6给我们带来一种全新的数据类型。Symbol的初衷:解决对象的属性名冲突。
//独一无二数据
//先定义一个变量
let s = Symbol();
console.log(s); //Symbol()
console.log(typeof s); //判断数据类型为 symbol
我们用一个Symbol( )函数来创建一个symbol类型的变量,我们打印了一下变量sm,得到的结果是控制台输出:Symbol( ),它代表着一个独一无二的值,但是我们看不到它是样子,但基本上,它有点类似字符串。
然后我们再测一下数据类型是否相等
let s = Symbol(); //独一无二数据
let s1 = Symbol();
console.log(s === s1); //false
console.log(typeof s); //symbol
console.log(typeof s1); //symbol
定义了两个symbol类型的变量s,s1 用全等符号===(也称严格相等既判断值有判断数据类型)进行比较,得到的是false。也就是说他们都是独一无二的值,并不相等。
我们可以用字符串a1和a2作为参数,然后打印出来的变量a1和a2就是Symbol(a1)和Symbol(a2),等于加上了标记,这样我们容易区分出来。
let s = Symbol('a1');
let s1 = Symbol('a2');
console.log(s); //Symbol(a1)
console.log(s1); //Symbol(a2)
我们在传参的时候,即使我们传的参是一样但数据类型依然不相等,对应的值还是不一样的,symbol永远都是独一无二的值
let s = Symbol('a1');
let s1 = Symbol('a1');
console.log(s); //Symbol(a1)
console.log(s1); //Symbol(a1)
console.log(s === s1); //false
Symbol是为了解决对象属性名冲突的问题,那么我们就结合对象,来学习,看以下代码:
let s = Symbol(); //声明一个变量
let obj = {
id: 1002,
[s]: "ok"
}
console.log(obj); //{id: 2, Symbol(): 'ok'}
console.log(obj[s]); //ok
console.log(obj[Symbol()]); //undefined
console.log(obj.s); //undefined
我们使用中括号的 [ s ] 可以正确获取到里面的值。使用点运算符的形式,会获取失败。因为:当symbol值作为对象的属性名的时候,不能用点运算符获取对应的值,需要加中括号进行获取。
属性名的遍历。当symbol类型的值作为属性名的时候,该属性是不会出现在for...in和for...of中的,也不会被Object.keys( )获取到。看以下代码:
function Person(age, name, id) {
this[Symbol()] = age;
this.name = name;
this.id = id;
}
//new实例对象
let p = new Person(20, '张强', '423429342342');
console.log(p); //{name: '张强', id: '423429342342', Symbol(): 20}
console.log(Object.keys(p)); //['name', 'id']
for (let key in p) {
console.log(key); //也只获取到 name id
}
如果我们就是想要获取symbol类型的属性怎么办?可以使用Object.getOwnPropertySymbols( );方法. Object.getOwnPropertySymbols( )方法 它会找到symbol类型的属性并且返回一个数组,数组的成员就是symbol类型的属性值,看以下代码:
function Person(age, name, id) {
this[Symbol()] = age;
this.name = name;
this.id = id;
}
//new实例对象
let p = new Person(20, '张强', '423429342342');
console.log(p); //{name: '张强', id: '423429342342', Symbol(): 20}
//获取
Object.getOwnPropertyDescriptor(p);
console.log(p); //Person {name: '张强', id: '423429342342', Symbol(): 20}
我们还可以使用Reflect.ownKeys函数 来进行获取,看以下代码:
//使用Reflect.ownKeys() 方法获取属性名
function Person(age, name, id) {
this[Symbol()] = age;
this.name = name;
this.id = id;
}
//new实例对象
let p = new Person(20, '张强', '423429342342');
console.log(p); //{name: '张强', id: '423429342342', Symbol(): 20}
console.log(Reflect.ownKeys(p)); // ['name', 'id', Symbol()]