一,什么是Symbol?
1.symbol
是es6新增的一个原始数据类型,代表独一无二的值。在ES5中javascript只有String
Object
Number
undefined
Boolean
五种数据类型,而Symbol
就是第六种
二,Symbol语法
1.声明一个Symbol
值,注意,虽然Symbol
是一个构造函数,但不能使用new
命令声明,这是因为生成的 Symbol
是一个原始类型的值,不是对象。也就是说,由于 Symbol
值不是对象,所以不能添加属性。
{
let a = Symbol()
let b = Symbol()
console.log(a) // Symbol()
console.log(b) // Symbol()
console.log(a===b) // false
console.log(typeof a) // symbol
}
2.可以为Symbol
值添加一个描述,便于区分。
{
let a = Symbol('A')
let b = Symbol('B')
console.log(a) // Symbol('A')
console.log(b) // Symbol('B')
console.log(typeof a) // symbol
}
3.Symbol.prototype.description
ES2019 提供了一个实例属性description,直接返回 Symbol
的描述
{
let a = Symbol('A')
let b = Symbol('B')
console.log(a.description) // 'A'
}
三,Symbol作为对象的属性
1.Symbol
作为对象的属性可以防止对象的键被误改覆盖。
{
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!'; // 注意,这里mySymbol不是字符串,是个Symbol值。
// 第二种写法
let a = {
[mySymbol]: 'Hello!'
};
}
注意,Symbol
值作为对象属性名时,不能用点运算符,因为点运算后面会被解析成字符串,而不是Symbol
值
{
const mySymbol = Symbol();
const a = {};
a.mySymbol = 'Hello!'; //这里的mySymbol是个字符串。
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"
}
四,js内置的Symbol 值
1.Symbol.iterator
: 对象的Symbol.iterator
属性,指向该对象的默认遍历器方法,对象进行for...of
循环时,会调用Symbol.iterator
方法,返回该对象的默认遍历器,