目录
1.Symbol
1.1Symbol的特点
1.2 Symbol创建对象属性
1.3 .Symbol 内置值
2.迭代器
1.Symbol
1.1Symbol的特点
Symbol是ES6新增的一种数据类型,表示独一无二的值,是一种类似于字符串的数据类型。
1.Symbol 的值是唯一的,用来解决命名冲突的问题
let s1 = Symbol();
s1 = Symbol('aaa');
console.log(s1, typeof s1); //Symbol(aaa) 'symbol';
let s2 = Symbol('aaa');
console.log(s2, typeof s2);//Symbol(aaa) 'symbol'
console.log(s1 == s2); //false
//虽然s2和s1包含的内容一样,但Symbol()具有唯一性,所以两者是不相等的。
2. Symbol的值不能与其他数据进行运算
const sym = Symbol("symbol");
// 以下操作会导致错误
const result = sym + 10;
console.log(result);
3.Symbol定义的对象属性不能用for in循环遍历,但是可以使用Reflect.ownKeys 来获取对象的所有键名
4.可以通过 for 关键字来实现两个Symbol类型的数据相等。
let s1 = Symbol.for('aaa');
let s2 = Symbol.for('aaa');
console.log(s1 == s2); //true
注意:遇到唯一性的场景时要想到Symbol
1.2 Symbol创建对象属性
给对象添加属性和方法,向对象中添加up 和down方法
不知道里面有没有这两个方法(不用去查,直接做就可以,很安全,快速)
let game={
name:'',
up:function(){console.log('上升')},
down:function(){console.log('下降')}
//2.添加方法的另一种
[Symbol.for('say')]:function(){
console.log('我可以说话')
}
}
//声明一个对象
let methods={
up:Symbol(),
down:Symbol()
};
//1.添加方法的一种
game[methods.up]=function(){ console.log('up')}
game[methods.down]=function(){ console.log('down')}
console.log(game);
//调用方法
game[methods.down]();
game[Symbol.for('say')]();
1.3 .Symbol 内置值
除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,
指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行。
Symbol.hasInstance |
当其他对象使用 instanceof 运算符,判断是否为该对 象的实例时,会调用这个方法 |
Symbol.isConcatSpreadable |
对象的 Symbol.isConcatSpreadable 属性等于的是一个 布尔值,表示该对象用于 Array.prototype.concat()时, 是否可以展开。 |
Symbol.species |
创建衍生对象时,会使用该属性 |
Symbol.match |
当执行 str.match(myObject) 时,如果该属性存在,会 调用它,返回该方法的返回值 |
Symbol.replace |
当该对象被 str.replace(myObject)方法调用时,会返回 该方法的返回值。 |
Symbol.search |
当该对象被 str.search (myObject)方法调用时,会返回 该方法的返回值。 |
Symbol.split |
当该对象被 str.split(myObject)方法调用时,会返回该 方法的返回值。 |
Symbol.iterator |
对象进行 for...of 循环时,会调用 Symbol.iterator 方法, 返回该对象的默认遍历器 |
Symbol.toPrimitive |
该对象被转为原始类型的值时,会调用这个方法,返 回该对象对应的原始类型值。 |
Symbol. toStringTag |
在该对象上面调用 toString 方法时,返回该方法的返 回值 |
Symbol. unscopables |
该对象指定了使用 with 关键字时,哪些属性会被 with 环境排除。 |
2.迭代器
迭代器(Iterator)就像是一把遍历工具,可以帮助我们逐个访问集合中的元素,而不需要知道集合内部是如何存储的。使用迭代器,我们可以轻松地对数组、集合、映射等数据结构进行遍历操作。需要自定义遍历数据的时候,要想到迭代器。
在代码中,迭代器提供了一个类似的功能:通过调用迭代器对象的 next()
方法,我们可以逐个获取集合中的元素,直到遍历结束。这样,我们就能够以一种简单、统一的方式来处理各种不同类型的数据集合。任何数据结构只要部署 Iterator 接口就是对象的一个属性,叫Symbol.interator,就可以通过for...of完成遍历操作。
原生具备 iterator 接口的数据(可用 for of 遍历):
- Array
- Arguments
- Set
- Map
- String
- TypedArray 指定元素类型的数组,而不是实际的数组类型
- NodeList
// 使用 Generator 函数定义一个简单的迭代器
function* myGenerator() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
// 创建一个迭代器实例
const iterator = myGenerator();
// 使用 for...of 循环遍历迭代器
for (let value of iterator) {
console.log(value);
}