es6+最佳入門實踐(6)

6.Symbol用法

6.1.什麼是Symbol?

Symbol是es6中一種新增加的數據類型,它表示獨一無二的值。es5中我們把數據類型分爲基本數據類型(字符串、數字、布爾、undefined、null)和引用數據類型(Object),在es6中新增的Symbol數據類型劃分到基本數據類型

爲什麼會有這樣一種數據類型呢?

//別人給了你一個定義好的對象
var obj = {
    name: "xiaoqiang",
    showName: function(){alert(1)}
}
//你拿到對象想給這對象添加新的屬性和方法的時候,可能會創建出一個name屬性和showName方法
obj.name = "nodeing"
obj.showName = function(){alert(2)}

//這個時候,新增加的方法和屬性就會去把原有的方法覆蓋,這樣就產生了衝突

由於對象的屬性和方法是字符串組成,這樣新增方法和屬性的時候有可能衝突,在es6中就新增了一種數據類型,表示獨一無二的值

通過Symbol函數可以創建一個獨一無二的值

let s1 = Symbol()
let s2 = Symbol()

console.log(s1 === s2) //false 說明創建出來的s1和s2 並不是相同的
console.log(s1, s2); //Symbol() Symbol()

上述代碼中,打印出來的值都是Symbol() , 怎樣才能區分誰是s1,誰是s2呢?我們可以通過傳參的形式來解決

//傳入的參數就是對當前Symbol的描述,用來區分Symbol
let s1 = Symbol("s1")
let s2 = Symbol("s2")
console.log(s1, s2);  //Symbol(s1) Symbol(s2)

6.2.應用場景

Symbol通常用於設置對象的屬性名或者方法,防止新加入的屬性或者方法與原來屬性或者方法衝突

let name = Symbol("name");

let name = Symbol("name");
let show = Symbol("show");

let obj = {
    //設置屬性
    [name]: 'xiaoqiang',
    [show](){alert(1)}
};
//取值
console.log(obj[name]);
//調用方法
obj[show]()

6.3.注意事項

注意1: Symbol裏面的參數僅僅是對Symbol的描述,沒有其他意義,因此,即使描述相同,Symbol也是不同的

console.log(Symbol("nodeing") === Symbol("nodeing")) //false

注意2:Symbol函數不能使用New關鍵字調用

let s1 = new Symbol(); //報錯

注意3: Symbol類型在做類型轉換的時候不能轉成數字


let s1 = Symbol("s1");
console.log(String(s1));  //Symbol(s1)
console.log(Boolean(s1));  //true
console.log(Number(s1)) //報錯

注意4: Symbol不能做任何運算

console.log(Symbol("s1") + "nodeing") //報錯
console.log(Symbol("s1") - 100) //報錯

注意5: Symbol在作爲對象屬性或者方法的時候,如果不賦值給一個變量的話,沒有辦法取值

let obj = {
    //設置屬性
    [Symbol("name")]: 'xiaoqiang'
};
//取值
console.log(obj[Symbol("name")]);

注意6: Symbol沒有辦法被for in循環遍歷

let name = Symbol('name')
let age = Symbol('age')
let obj = {
    a: 1,
    b: 2,
    [name]: 'xiaoqiang',
    [age]: 18
};
for(let attr in obj){
    console.log(attr,obj[attr])  //a b
}

可以使用Object.getOwnPropertySymbols查看對象上所有的symbol屬性

console.log(Object.getOwnPropertySymbols(obj))

視頻教程地址:http://edu.nodeing.com/course/50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章