ES6新增基本資料型別 Symbol
阿新 • • 發佈:2021-03-27
目錄
基本資料型別 Symbol
目的: 就是為了擴充套件物件 (解決物件屬性名衝突的問題)
下面這個例子,
我們不知道這裡面輸出的值每一個對應的是誰
var a = 100;
var b = 100;
console.log(a, b)//100 100
宣告一個Symbol型別資料
let a = Symbol();
let b = Symbol();
console.log(a == b);//flase
console.log(a === b);//flase
console.log(a, b);//Symbol() Symbol()
這樣的話a 和b 雖然看著一樣,其實是不一樣的
區分symbol 型別只要傳入引數即可
let a = Symbol('asymbol')
let b = Symbol('bsymbol')
console.log(a, b);
遍歷
回顧一下遍歷物件 用obj[key] 而不用 obj.key
是因為 [key] 這種寫法是一個變數
而obj.key 代表 物件中的某個屬性key
// 遍歷物件
let obj = {
name: 'tom',
age:18,
say:'hello world'
}
for(let key in obj){
console.log(obj[key]); // key是一個變數 能夠遍歷到 tom 18 hello world
// console.log(obj.key); // 物件中的某個屬性key
}
含有 Symbol 屬性的遍歷
Symbol 作為物件的屬性存在 需要使用[symbol的變數名]:value
下面的兩個name是兩個不同的name
let name = Symbol('name');
let person = {
name:'張三',
age:18,
[name]:'李四',
[Symbol('sing')]:'唱歌'
}
// 遍歷物件 symbol 屬性不會被遍歷
for(let key in person){
console.log(key);
}
我們看到symbol 屬性沒有遍歷
Symbol特有的遍歷
通過 Object.getOwnPropertySymbols() 方法獲取物件中所有的Symbol
let res = Object.getOwnPropertySymbols(person)
console.log(res);//[Symbol(name), Symbol(sing)]
但是上述方法只能遍歷物件中所有的Symbol
es6 提供了一個新的方法 Reflect.ownKeys() 可以 獲取物件中所有的屬性 ,
包含普通屬性和 Symbol屬性
let res = Reflect.ownKeys(person)
console.log(res);