1.Symbol 值通過Symbol 函數生成,凡是屬性名屬於Symbol 類型,就是 獨一無二的,可以保證不會與其他屬性名衝突。 // 沒有參數的時候 let s1 = Symbol(); let s2 = Symbol(); s1 s2; // false // 有參數的情況 let s1 = ...
1.Symbol 值通過Symbol 函數生成,凡是屬性名屬於Symbol 類型,就是 獨一無二的,可以保證不會與其他屬性名衝突。 // 沒有參數的時候 let s1 = Symbol(); let s2 = Symbol(); s1 === s2; // false // 有參數的情況 let s1 = Symbol('foo'); let s2 = Symbol('foo'); s1 === s2 // false 2.作為屬性名的 Symbol 由於每個Symbol 值都是不相等的,用於對象的屬性名,就能保證不會重覆出現。 let mySymbol = Symbol(); // 第一種寫法 let a = {}; a[mySymbol] = 'Hello'; // 第二種寫法 let a = { [mySymbol]: 'Hello' } // 第三種寫法、 let a = {}; Object.definePropert(a,mySymbol,{value: 'Hello!'}) a[mySymbol] // "Hello!" 3.屬性名的遍歷 Symbol 作為屬性名,該屬性不會出現在for...in,for...of 迴圈中,也不會出現在Object.keys(), Object.getOwnPropertyNames(),JSON.stringify() 返回。 只有Object.getOwnPropertySymbols 方法可以獲取指定對象的所有Symbol 屬性名。 const obj = {}; let a = Symbol('a'); let b = Symbol('b'); obj[a] = 'Hello'; obj[b] = 'World'; const objectSymbols = Object.getOwnPropertySymbols(obj) console.log(objectSymbols) // [Symbol(a),Symbol(b)] 4.Es6 提供內置 Symbol. Symbol.hasInstance Symbol.isConcatSpreadable Symbol.species Symbol.match Symbol.replace Symbol..split Symbol..iterator Symbol.toPrimitive Symbol.toStringTag