在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)]