在js已有的基本類型(字元串,數值,布爾型,null和undefined)之外,es6引入了一種新的基本類型:==符號(Symbol)==。符號起初被設計用於創建對象私有成員。 符號沒有字面量形式,你可以使用全局Symbol函數來創建一個符號值。 Symbol還可以接受一個額外的參數用於描述符號值。 ...
在js已有的基本類型(字元串,數值,布爾型,null和undefined)之外,es6引入了一種新的基本類型:==符號(Symbol)==。符號起初被設計用於創建對象私有成員。
符號沒有字面量形式,你可以使用全局Symbol函數來創建一個符號值。
let firstName = Symbol();
let person = {};
person[firstName] = "nicolas";
console.log(person[firstName]);
Symbol還可以接受一個額外的參數用於描述符號值。建議始終給符號提供描述信息,以便更好的閱讀代碼和進行調試。
使用符號值
let firstName = Symbol("first name");
let person = {
[firstName]: "nicolas"
}
//讓改屬性變成只讀的
Object.defineProperties(person, firstName, {
writable: false
});
let lastName = Symbol("last name");
Object.defineProperties(person, {
[lastName]: {
value: "cc",
writable: false
}
});
person[lastName] = "dd";
console.log(person[firstName]);//nicolas
console.log(person[lastName]);//cc
共用符號值
如果要創建共用符號值,應使用Symbol.for()方法而不是Symbol()方法。Symbol.for()接受單個字元串類型的參數,作為目標符號值的標識符,同時此參數也會成為該符號的描述信息。
let uid = Symbol.for("uid");
let object = {};
object[uid] = "12345";
console.log(object[uid]);//12345
console.log(uid);//Symbol(uid)
Symbol.for()方法首先會搜索全局符號註冊表,看是否存在一個鍵值為“uid”的符號值。
檢索符號屬性
Object.keys()和Object.getPropertyNames()方法可以檢索對象的所有屬性和名稱,前者返回所有的可枚舉屬性名稱,後者返回所有屬性名稱而無視其是否可枚舉。es6新增了Object.getOwnPropertySymbols()方法,以便可以檢索對象的符號類型屬性。
let uid = Symbol.for("uid");
let first = Symbol("first name");
let object = {
name: "cc",
age: 26
};
object[uid] = "12345";
object[first] = "111";
console.log(Object.getOwnPropertyNames(object));//["name","age"]
console.log(Object.getOwnPropertySymbols(object));//[Symbol(uid),Symbol(first name)]