ES6系列_10之Symbol在物件中的作用
阿新 • • 發佈:2018-12-05
在ES5中 物件屬性名都是字串,這容易造成屬性名的衝突,比如,你使用了一個他人提供的物件,但又想為這個物件新增新的方法(mixin 模式),新方法的名字就有可能與現有方法產生衝突,於是 ES6 引入了Symbol。Symbol是一種新的原始資料型別,表示獨一無二的值。它是繼
undefined
、null
、布林值(Boolean)、字串(String)、數值(Number)、物件(Object)六種資料型別之後的第七種資料型別。凡是屬性名屬於 Symbol 型別,就都是獨一無二的,可以保證不會與其他屬性名產生衝突。
1.宣告Symbol
Symbol
函式可以接受一個字串作為引數,表示對 Symbol 例項的描述,主要是為了在控制檯顯示,或者轉為字串時,比較容易區分。
var f= Symbol();//Symbol()
var f= Symbol('foo');//Symbol(foo)
// 沒有引數的情況 let s1 = Symbol(); let s2 = Symbol(); s1 === s2 // false // 有引數的情況 let s1 = Symbol('foo'); let s2 = Symbol('foo'); s1 === s2 // false
注意,Symbol
函式的引數只是表示對當前 Symbol 值的描述,因此相同引數的Symbol
函式的返回值是不相等的。
s1
和s2
都是Symbol
函式的返回值,而且引數相同,但是它們是不相等的。
2.Symbol在物件中的應用
Symbol作為屬性名:
let mySymbol = Symbol(); // 第一種寫法 let a = {}; a[mySymbol] = 'Hello!'; // 第二種寫法 let a = { [mySymbol]: 'Hello!' }; // 第三種寫法 let a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上寫法都得到同樣結果 a[mySymbol] // "Hello!"
賦值-括號形式:
a[mySymbol]='web';
3.Symbol物件元素的保護作用
在物件中有很多值,但是迴圈輸出時,並不希望全部輸出,那我們就可以使用Symbol進行保護。
沒有進行保護的寫法:
var obj={name:'小明',skill:'web',age:18}; for (let item in obj){ console.log(obj[item]); }
現在我不想別人知道我的年齡,這時候我就可以使用Symbol來進行迴圈保護。
let obj={name:'小明',skill:'web'}; let age=Symbol(); obj[age]=18; for (let item in obj){ console.log(obj[item]);//小明、web } console.log(obj[age]);
待續.....