Symbol 是 JavaScript 中的一种基本数据类型,是在 ECMAScript 2015(ES6)中引入的。它是一种原始值,表示独一无二的标识符
。每个从 Symbol() 调用返回的值都是唯一的。
创建Symbol
const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // false,每个 Symbol 值都是唯一的
Symbol具体使用场景
使用 Symbol 作为对象属性键
防止对象属性键被覆盖
Symbol 主要用于创建对象的属性键,这些键是独一无二
的,不会与其他属性键冲突。这有助于防止命名冲突和属性覆盖。
const mySymbol = Symbol('mySymbol');
const obj = {
name: 'John',
age: 30,
[mySymbol]: 'This is a symbol property'
};
console.log(obj[mySymbol]);
预定义的Symbol
Symbol.iterator: 用于定义对象的默认迭代器。
Symbol.toStringTag: 用于定制对象的 toString() 方法返回的字符串标签。
Symbol.hasInstance: 用于定制对象的 instanceof 操作符的行为。
Symbol.iterator 迭代器
当对象拥有一个名为 Symbol.iterator 的方法时,它就被认为是“可迭代”
的。
迭代器的关键是for...of
循环内部会调用对象的 Symbol.iterator 方法,获取迭代器,然后通过迭代器的 next 方法逐个访问数组的元素。
迭代器示例:
const iterable = {
data: [1, 2, 3],
index: 0,
next() {
return this.index < this.data.length
? { value: this.data[this.index++], done: false }
: { done: true };
}
};
const iterator = iterable.next();
console.log(iterator.value); // 1
console.log(iterator.done); // false
const iterator1 = iterable.next();
console.log(iterator1.value); // 2
const iterator2 = iterable.next();
console.log(iterator2.value); // 3
const iterator3 = iterable.next();
console.log(iterator3.value); // undefined
迭代器语法糖for of
for of不能用于对象,因为对象没有返回迭代器的**Symbol.iterator**方法。
for( let value of map){
console.log(value)
}
解构原理
解构其实也是调用iterator,在解构数组或对象时,JavaScript 引擎会使用迭代器协议来访问和提取相应的值。