📅  最后修改于: 2023-12-03 15:16:17.005000             🧑  作者: Mango
在ES6中引入了Symbol这个新的基本数据类型。Symbol是表示唯一标识符的一种新的方式。它可以用来创建对象的私有成员,也可以作为对象属性的键。本文将介绍Symbol的特性、使用方式和一些注意点。
每个Symbol实例都是唯一的。
const a = Symbol();
const b = Symbol();
console.log(a === b); // false
使用Symbol作为对象属性的键可以避免键名冲突,同时使对象更加清晰。
const obj = {
[Symbol("foo")]: "bar"
};
console.log(obj[Symbol("foo")]); // undefined
console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // "bar"
在上面代码中,obj对象的foo属性的键是一个Symbol值,并且无法通过其他方式获取到这个键。
JavaScript内置了很多Symbol常量,比如Symbol.toStringTag、Symbol.iterator等。
const arr = [1, 2, 3];
console.log(arr[Symbol.iterator]); // f values() { [native code] }
在上面代码中,arr是一个数组,它的Symbol.iterator属性是一个函数,用来获取数组的迭代器。
使用Symbol需要调用Symbol构造函数,传一个参数表示Symbol的描述,描述可以用于调试。
const a = Symbol("description");
console.log(a); // Symbol(description)
Symbol也可以来实现对象的私有属性。
const obj = (function() {
const privateProperty = Symbol();
return {
[privateProperty]: "I'm private",
publicProperty: "I'm public",
getPrivateProperty() {
return this[privateProperty];
}
};
})();
console.log(obj.publicProperty); // "I'm public"
console.log(obj.getPrivateProperty()); // "I'm private"
在上面代码中,私有属性privateProperty的键是一个Symbol值,不能通过其他方式获取到,从而实现了对象的私有属性。
使用new关键字调用Symbol构造函数会抛出TypeError异常。因此,Symbol需要直接调用。
const a = new Symbol(); // TypeError: Symbol is not a constructor
const b = Symbol(); // Works
Symbol与字符串类似,但它们是不同的数据类型。
const a = Symbol("description");
const b = "Symbol(description)";
console.log(a == b); // false
在上面代码中,Symbol值与字符串值并不相等。
Symbol是一种新的基本数据类型,它具有唯一性、可以作为对象属性的键、内置常量等特性。通过Symbol,我们可以实现对象的私有属性等高级特性。在使用Symbol时需要注意一些细节,如不应调用new关键字、Symbol不是字符串等。