概述
ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。 ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。
使用
Symbol 函数栈不能用 new 命令, 因为 Symbol 是原始数据类型,不是对象。
let s1: symbol = Symbol(1);
let s2: symbol = Symbol(1);
console.log(s1 === s2); // false
Symbol是不可改变且唯一的,每一个Symbol都是单独的内存地址存起来的,因此返回false。
思考:如何让两个Symbol返回true呢?
console.log(Symbol.for("qwe") === Symbol.for("qwe")); // true
Symbol.for:全局查找是否注册过, 如果注册过,返回已有的;反之,进行注册。
let obj = {
name: "qwe",
[s1]: 111,
[s2]: 222,
};
console.log(obj); // { name: 'qwe', [Symbol(1)]: 111, [Symbol(1)]: 222 }
Symbol 可以作为key,进而保证key的唯一性
let obj = {
name: "qwe",
[s1]: 111,
[s2]: 222,
};
for (let key in obj) {
console.log(key); //name
}
for in 不能读取Symbol
let obj = {
name: "qwe",
[s1]: 111,
[s2]: 222,
};
console.log(Object.keys(obj)); // [ 'name' ]
Object.keys 不能读取Symbol
let obj = {
name: "qwe",
[s1]: 111,
[s2]: 222,
};
console.log(Object.getOwnPropertyNames(obj)); // [ 'name' ]
Object.getOwnPropertyNames 不能读取Symbol
let obj = {
name: "qwe",
[s1]: 111,
[s2]: 222,
};
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(1), Symbol(1) ]
Object.getOwnPropertySymbols 只读取Symbol,其他属性不读取
let obj = {
name: "qwe",
[s1]: 111,
[s2]: 222,
};
console.log(Reflect.ownKeys(obj)); // [ 'name', Symbol(1), Symbol(1) ]
Object.getOwnPropertySymbols 读取Symbol和其他属性(读取对象所有属性)