這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰javascript
ES5 的對象屬性名都是字符串,容易形成屬性名的衝突java
ES6 引入了一種新的原始數據類型 Symbol,表示獨一無二的值git
Symbol 是 JavaScript 語言的第七種數據類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)github
console.log(typeof Symbol());
// symbol
複製代碼
使用 Symbol() 產生惟一值緩存
// 不可以使用 new 命令
const a = Symbol();
const b = Symbol();
console.log(a === b);
// false
複製代碼
Symbol 類型不能夠添加屬性markdown
const a = Symbol();
a.name = 'a';
console.log(a.name);
// undefined
複製代碼
Symbol 函數可添加描述,相同描述返回值並不相同函數
const a = Symbol('a');
console.log(a.toString());
// Symbol(a)
複製代碼
Symbol 不能與其餘值混合運算,但能夠顯式轉換爲字符串、布爾值oop
當咱們須要重複使用一個 Symbol 值,能夠使用 Symbol.for 進行全局登記post
const a = Symbol.for("123");
const b = Symbol.for("123");
console.log(a === b);
// true
複製代碼
Sybmol.keyFor 能夠返回一個已登記的 Symbol 的 Keyui
const a = Symbol.for("123");
console.log(Symbol.keyFor(a));
// 123
複製代碼
Symbol 做爲屬性名解決名稱衝突
// 做爲屬性名時,須使用 [] 進行聲明和取值
const name = Symbol.for("name");
const person = {
[name]: 'Cade'
}
console.log(person[name]);
// cade
複製代碼
緩存操做中解決名稱衝突問題
class Cache {
static data = {};
static set(name, value) {
this.data[name] = value;
}
static get(name) {
return this.data[name];
}
}
let user = {
name: 'Cade',
key: Symbol('user')
};
let cart = {
name: '購物車',
key: Symbol('cart')
};
Cache.set(user.key, user);
Cache.set(cart.key, cart);
console.log(Cache.get(user.key));
複製代碼
Symbol 做爲屬性名不能被遍歷獲得
不能經過 for in、Object.keys 獲取 Symbol 類型屬性名
let symbol = Symbol("123");
let obj = {
name: "Cade",
[symbol]: "abc"
};
for (const key in obj) {
console.log(key);
}
// name
for (const key of Object.keys(obj)) {
console.log(key);
}
// name
複製代碼
能夠使用 Object.getOwnPropertySymbols 獲取全部 Symbol 屬性
for (const key of Object.getOwnPropertySymbols(obj)) {
console.log(key);
}
複製代碼
也能夠使用 Reflect.ownKeys(obj) 獲取全部屬性包括 Symbol
for (const key of Reflect.ownKeys(obj)) {
console.log(key);
}
複製代碼
JavaScript 內置了許多系統 Symbol,以使用它們來微調對象的各個方面
Symbol.hasInstance
使用 a instanceof A 時,實際上執行的是 A[Symbol.hasInstance](a)
class A {
static [Symbol.hasInstance](val) {
return val instanceof Array;
}
}
console.log([1, 2, 3] instanceof A);
// true
複製代碼
Symbol.toPrimitive
當對象被轉爲原始類型的值時,會調用 Symbol.toPrimitive 方法,返回該對象對應的原始類型值
Symbol.toPrimitive 被調用時,會接受一個字符串參數,表示當前運算的模式,一共有三種模式
const obj = {
[Symbol.toPrimitive](hint) {
switch (hint) {
case 'number':
return 123;
case 'string':
return 'str';
case 'default':
return 'default';
default:
throw new Error();
}
}
};
console.log(2 * obj);
// 246
console.log(3 + obj);
// '3default'
console.log(obj == 'default');
// true
console.log(String(obj));
// 'str'
複製代碼
其餘內置 Symbol 參見 Well-Known Symbols