1. 程式人生 > 其它 >ES6新增基本資料型別 Symbol

ES6新增基本資料型別 Symbol

目錄

基本資料型別 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);

在這裡插入圖片描述