1. 程式人生 > >ES6系列_10之Symbol在對象中的作用

ES6系列_10之Symbol在對象中的作用

沒有 括號 容易 別人 ava 聲明 kill ber num

在ES5中 對象屬性名都是字符串,這容易造成屬性名的沖突,比如,你使用了一個他人提供的對象,但又想為這個對象添加新的方法(mixin 模式),新方法的名字就有可能與現有方法產生沖突,於是 ES6 引入了Symbol。Symbol是一種新的原始數據類型,表示獨一無二的值。它是繼undefinednull、布爾值(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函數的返回值是不相等的。

s1s2都是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]);

待續.....

ES6系列_10之Symbol在對象中的作用