ES6新特性(四) Symbol和迭代器Iterator的使用

一、Symbol

应用场景:因为每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。
1.1. 什么是Symbol ?
1.1.1. Symbol是ES6中新增的原始数据类型,Symbol提供一种独一无二的值
比如:在js中声明一个变量a = 5;再声明一个变量b = 5; 虽然这两个变量名不同,但是值是相等的;使用Symbol声明的值不重复、不相等。
1.2. 如何使用Symbol。

//两个不同变量名的值是相等的
let a = 1;
let b = 1;
console.log(a===b);//true
            
//如何使用Symbol声明一个独一无二的值
let c = Symbol('abc');
let d = Symbol('abc');
console.log(c===d);//false

1.3. Symbol.for()方法的使用
Symbol.for()方法:不同的变量,可以使用同一个Symbol值,Symbol.for()方法接收一个参数,然后查找是否有以该参数作为名称的Symbol值,如果有就返回这个Symbol值,否则就新建一个以该参数为名称的Symbol值。

//Symbol.for()方法的使用
 let a = Symbol.for('abc');
 let b = Symbol.for('abc');
 console.log(a===b)//true

1.4. Symbol.keyFor()方法的使用
Symbol.keyFor() 返回一个已使用的 Symbol 类型值的key,用来检测该参数作为名称的 Symbol 值是否已被使用

//Symbol.keyFor()方法的使用
 let a = Symbol.for('abc');
 let b = Symbol.keyFor(a);
 console.log(b);// abc

1.5. Symbol的应用场景:
作为对象的属性名

let a = Symbol.for('abc');
            
let obj = {
    [a]:123,
    b:456
}
console.log(obj);//{b: 456, Symbol(abc): 123}

** 1.6. Symbol属性名获取值**
当Symbol值为对象的属性名时,使用普通的遍历方法 比如: entries()方法是获取不到Symbol属性名的。
Object.getOwnPropertySymbols()方法:接收一个对象参数,返回一个数组,只能获取到Symbol类型的属性名,普通的属性名获取不到。
Reflect.ownKeys()方法:同样也是接收一个对象参数,返回一个数组,不同的是:能获取对象中所有的属性名和所对应的值,包括Symbol变量的属性名。
 两种遍历方法的使用:

let a = Symbol.for('abc');
            
let obj = {
    [a]:123,
    def:456
}
            
//Object.getOwnPropertySymbols()方法的使用
let arr = Object.getOwnPropertySymbols(obj);
console.log(arr);// [Symbol(abc)]
arr.forEach(item =>{
    //输出属性名和属性值
    console.log(item,obj[item]);//键(key):Symbol(abc) 值(value):123
})
            
//Reflect.ownKeys()方法的使用
let arr2 = Reflect.ownKeys(obj);
console.log(arr2);//  ["def", Symbol(abc)]
arr2.forEach(item =>{                
    //输出属性名和属性值
    console.log(item , obj[item]);// def 456 | Symbol(abc) 123
})

二、Iterator迭代器的使用

2.1. Iterator是一个统一的接口,它的作用是使各种 可遍历的数据结构 能够被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。
2.2. 使用Symbol.iterator()r遍历集合:
Symbol.iterator()方法返回一个对象,该对象有一个 next() 方法用于返回当前位置的对象,每个对象有两个key选项,分别是 value 和 done 。value对应的值是当前属性的值,done则表示是否遍历结束 ,done 的值为 true 时表示遍历结束。

let arr = [1,2,3];
let map = arr[Symbol.iterator]();
console.log(map.next());//{value: 1, done: false}
console.log(map.next());//{value: 2, done: false}
console.log(map.next());//{value: 3, done: false}
console.log(map.next());//{value: undefined, done: true}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值