Symbol 类型
4.Symbol 类型
4.1 定义
ES6 中引入了一个新的原始数据类型Symbol
类型,它表示独一无二的值。
最大用途用来定义私有对象的私有成员。
ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。
它是一个基本类型的值,不能使用new
关键字来创建。
补充:==
与===
的区别,详细请参考https://www.runoob.com/note/12388
const name1 = Symbol('name');
const name2 = Symbol('name');
console.log(name1===name2);// 虽然两个值相同的类型,相同的值,但是内存地址时不同的。
>>> false
4.2 使用场景
说明:一般使用较少,通常用来定义私有成员。由于 每一个Symbol的值都是不相等的,所以Symbol作为对象的属性(键),可以保证属性不重复。
-
写法一
let s1 = Symbol('s1'); let obj = {}; obj[s1] = 'mm'; console.log(s1) // 输出的值唯一 >>> Symbol(s1) console.log(obj) //{Symbol(s1): 'mm'}
-
写法二
let s1 = Symbol('s1'); let obj2 = { [s1]:'jj'// 需要使用中括号进行包裹 } console.log(obj2);// >>> {Symbol(s1): 'jj'}
-
写法三
let s1 = Symbol('s1'); let obj3 = {} Object.defineProperty(obj3,s1,{ value:'mjj' })// 类似与通过反射为对象进行赋值的操作。 console.log(obj3);// console.log(obj3[s1]);//mjj console.log(obj3.s1);//undefined >>> {Symbol(s1): 'mjj'}
-
Symbol 作为对象属性名时不能用
.
运算符,要用方括号。因为.
运算符后面是字符串,所以取到的是字符串s1
属性,而不是 Symbol 值s1
属性
4.3 注意点
获取相关的键的时候需要使用对应的方法进行操作
let s1 = Symbol('s1');
let obj3 = {}
Object.defineProperty(obj3,s1,{
value:'mjj'
})
for (let key in obj3){
console.log(key);// 无输出
}
console.log(Object.keys(obj3)); //[]
let s = Object.getOwnPropertySymbols(obj3);
console.log(s);// [Symbol(s1)]
let m = Reflect.ownKeys(obj3);
console.log(m);// [Symbol(s1)]