基本概念
Symbol,表示獨一無二的值。它是 JS 中的第七種數據類型。
基本的數據類型: Null Undefined Number Boolean String Symbol
引用數據類型:Object
1.Symbol數據的聲明:
let s1 = Symbol();
let s2 = Symbol();
console.log(typeof s1); // 'symbol'
console.log(s1 === s2); //false
Symbol 函數前不能使用 new 否則會報錯,原因在于 Symbol 是一個原始類型的值,不是對象。
let s3 = Symbol('yy');
let s4 = Symbol('ll');
console.log(s3, s4); //Symbol(yy) Symbol(ll)
console.log(Symbol('momo') === Symbol('momo'));//false
Symbol 函數接收一個字符串作為參數,表示對Symbol的描述,主要是為了在控制臺顯示,或者轉為字符串的時候,比較容易區分
2.Symbol 數據類型的轉換
console.log(String(Symbol('yy'))); // Symbol(yy)
console.log(Symbol('ll').toString()); // Symbol(ll)
console.log(!!Symbol()); // true
console.log(Number(Symbol())); //報錯
console.log(Symbol('momo') + 'fff'); // 報錯
console.log(Symbol('momo') * 100); //報錯
Symbol數據類型不能做任何運算。轉為布爾值的時候是true,可以轉化為String類型。不能轉換為Number。
3.作為對象的屬性名
寫法一:
let yyy = Symbol('yyy');
const obj = {};
obj[yyy] = 'hello';
console.log(obj); // {Symbol(yyy): "hello"}
console.log(obj[yyy]); //hello
寫法二:
let ss = Symbol('ss');
const data = {
[ss]: 'world'
};
console.log(data);// {Symbol(ss): "world"}
console.log(data[ss]);//world
上面兩種方法都可以通過key來獲取到值。
const data = {
[Symbol()]: 123,
a: 1,
b: 2
};
console.log(data); //{a: 1, b: 2, Symbol(): 123}
console.log(data['Symbol()']); //undefind 無法獲取
這樣聲明后我們怎么來獲取到值呢?
我們可以通過Object.getOwnPropertySymbols方法獲得一個對象的所有的Symbol屬性。
console.log(Object.getOwnPropertySymbols(data)); // [Symbol()]
該方法返回的是一個數組,我們用數組的取值方法就可以拿到值
console.log(data[Object.getOwnPropertySymbols(data)[0]]); //123
值得注意的是:Symbol數據作為key時是不能被for。。in循環的。
for(let i in data){
console.log(i);
}
// a
//b
以上都是個人理解如有不對之處還望指正交流!