文章目录
- 一、Symbol特性
- 1.1 不支持语法new Symbol()
- 1.2 唯一性
- 1.3 不与其他值隐式转换
- 1.4 不可枚举
- 1.5 类型为symbol
- 二、Symbol常见方法
- 2.1 Symbol.toStringTag
- 2.2 Symbol.iterator
- 2.3 Symbol.for()
- 三、Symbol应用
在JavaScript中,Symbol 是一种基本数据类型,它是 ECMAScript 6(ES6)引入的新特性之一。Symbol 主要用于创建具有唯一性的标识符,这些标识符不会与其他任何值冲突。
一、Symbol特性
1.1 不支持语法new Symbol()
作为构造函数来说它并不完整,因为它不支持语法:“new Symbol()”
//错误用法
const mySymbol = new Symbol();
console.log(mySymbol) //Uncaught TypeError: Symbol is not a constructor
//正确用法
const mySymbol = Symbol();
console.log(mySymbol) //Symbol()
1.2 唯一性
每个通过 Symbol 创建的值都是唯一的,即使它们使用相同的描述
const symbol1 = Symbol('mySymbol');
const symbol2 = Symbol('mySymbol');
console.log(symbol1 === symbol2); // false
1.3 不与其他值隐式转换
Symbol 不会与其他数据类型隐式转换,这意味着不能通过简单的运算等方式与字符串拼接
const mySymbol = Symbol('我是');
const str = mySymbol + '七言'
console.log(str) //Uncaught TypeError: Cannot convert a Symbol value to a string
1.4 不可枚举
Symbol 创建的属性默认是不可枚举的,不会出现在 for…in 循环中。
const obj = {
val: 'value1',
[Symbol('mySymbol')]: 'value2'
};
for (let key in obj) {
console.log(key); // 输出 val,而不会输出 Symbol 属性
}
1.5 类型为symbol
const mySymbol = Symbol("mySymbol");
console.log(typeof mySymbol); // "symbol"
二、Symbol常见方法
2.1 Symbol.toStringTag
用于自定义对象的 Object.prototype.toString() 方法的返回值
class Fn{
}
const f = new Fn();
console.log(Object.prototype.toString.call(f)) //[object Object]
//改造一下
Fn.prototype[Symbol.toStringTag] = Fn.name;
console.log(Object.prototype.toString.call(f)) //[object Fn]
2.2 Symbol.iterator
用于定义对象的默认迭代器,使对象可以被 for…of 循环或扩展运算符(…)迭代
Object.prototype[Symbol.iterator] = function() {
let keys = Object.keys(this);
let length = keys.length;
let index = 0;
return {
next: () => {
return {
value: {[keys[index]]:this[keys[index]]},
done: index++ === length
}
}
}
}
let obj = {
a:1,
b:2,
c:3
}
for(let i of obj) {
console.log(i);
}
2.3 Symbol.for()
Symbol.for(key) 用于创建一个可被全局共享的 Symbol,如果已存在相同的 key,则返回已存在的 Symbol
Symbol.for("bar") === Symbol.for("bar");
三、Symbol应用
- 创建私有属性或方法: 由于 Symbol 是唯一的,可以用它创建类的私有属性或方法,以避免与其他代码冲突。
- 避免属性名冲突: 在对象中使用 Symbol 作为属性名,可以确保属性不会与其他属性冲突。
- 使用内置Symbol方法:JavaScript 提供了一些内置的Symbol方法,如上面的,可用于定义对象的行为