es6学习笔记整理(八)Symbol的用法
Symbol数据类型
概念:这种数据类型提供一个独一无二的值,也就是说Symbol声明的变量a和变量b永远不可能相等。
声明
let a = Symbol();
let b = Symbol();
console.log(a === b);
//false
它自己都不会等于它自己
Symbol.for
let c = Symbol.for("aaa");
let d = Symbol.for("aaa");
console.log(c === d);
//true
【es6学习笔记整理(八)Symbol的用法】Symbol.for和Symbol的唯一区别是 Symbol.for创建的两个实例可能相等, 根据Symbol的参数生成实例, 如果参数一样, 那么会返回同一个实例。
看到这里,还完全不知道要怎么使用,不急不急,接下来。。。
使用:
let a = Symbol.for('abc');
let obj = {
[a]:'111',
'abc':222,
'b':333
};
console.log('obj',obj);
//{abc: 222, b: 333, Symbol(abc): "111"}
console.log(Symbol.keyFor(a));
// abc 检索字符串键
这种使用就可以避免对象中键值相同替换的问题
但是这样使用会有一个问题,对象中使用Symbol做键值,通过for in 和 let of是拿不到那个属性。
···
for(let [key,value] of Object.entries(obj)){
console.log('entries',key,value); //abc 222; b 333
}
···
解决方法: Object.getOwnPropertySymbol()返回值是数组, 但是这个只能打印出Symbol做键值的值,这就尴尬了,下面使用reflect.ownKeys来解决这个问题
Object.getOwnPropertySymbols(obj).forEach(function (item) {
console.log('getOwnPropertySymbols', obj[item]);
//111
});
reflect.ownKeys()返回的也是数组
Reflect.ownKeys(obj).forEach(function (item){
console.log('ownKeys', item, obj[item]);
/*ownKeys abc 222
* ownKeys b 333
* ownKeys Symbol(abc) 111
* */
});
到这里也感觉了解甚浅,后面有机会补充。
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下
- (二)ES6第一节变量(let|(二)ES6第一节变量(let,const)
- 六步搭建ES6语法环境
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)