js-es6-Symbol新增的数据类型

来源:互联网 发布:chasing cars评价 知乎 编辑:程序博客网 时间:2024/05/30 23:41

1 什么是 Symbol ? Symbol,表示独一无二的值。它是 JS 中的第七种数据类型

let s1 = Symbol();let s2 = Symbol();console.log(s1===s2);//false

注意

Symbol 函数前不能使用 new 否则会报错,原因在于Symbol 是一个原始类型的值,不是对象。

Symbol 可以接收一个字符串作为参数,表示对Symbol的描述,主要是为了在控制台显示,或者转为字符串的时候,比较容易区分,不和任何数据相等

let s1 = Symbol('momo');let s2 = Symbol('zhuanzhuan');console.log(s1===s2);//falseconsole.log(Symbol('momo') === Symbol('momo'));//false

Symbol.for()首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了。

let s3=Symbol.for('s3');let s4=Symbol.for('s3');console.log(s3===s4);//true

Symbol的作用可以解决冲突

let s1=Symbol.for('abc');let obj={[s1]:'123','abc':345,'c':456}console.log(obj);//{abc: 345, c: 456, Symbol(abc): "123"}

2 Symbol 数据类型的转换

可以转换成字符串,布尔值

console.log(String(Symbol('momo'))); // Symbol(momo)console.log(Symbol('zhuanzhuan').toString()); // Symbol(zhuanzhuan)console.log(!!Symbol()); // true
不能做任何运算

console.log(Number(Symbol()));//报错console.log(Symbol('momo') + 'chuqiao');//报错console.log(Symbol('momo') * 100);//不能做任何运算。

3 作为对象的属性名

let yy = Symbol('yy');const obj = {};obj[yy] = 'hello';console.log(obj);//{Symbol(yy): "hello"}console.log(obj[yy]);//hello

let ss = Symbol('ss');const data = {  [ss]: 'momo'};console.log(data);//{Symbol(ss): "momo"}console.log(data[ss]);//momo

4.不能被for...in    for...of   values()   keys()   entries()循环遍历

虽然不能被遍历,但是也不是私有的属性,可以通过Object.getOwnPropertySymbols方法获得一个对象的所有的Symbol属性

通过Reflect.ownKeys()可以遍历对象所有的属性

const data = {  [Symbol()]: 123,  a: 1,  b: 2};console.log(data);//{a: 1, b: 2, Symbol(): 123}console.log(data['Symbol()']);//undefinedfor(let i in data){  console.log(i);//a b}console.log(Object.getOwnPropertySymbols(data)); // [Symbol()]console.log(data[Object.getOwnPropertySymbols(data)[0]]);//123console.log(Reflect.ownKeys(data));//["a", "b", Symbol()]



原创粉丝点击