ES5中有以下数据类型:undefined、Null、String、Number、Boolean、Object
ES6新增一种数据类型:symbol
一,作用:
这种数据类型的主要作用是防止对象属性重名
在给一个未知对象添加新属性时,很容易覆盖原有的属性
let a={ key:'val' } a.key='test'
通过 Symbol 数据类型可以生成独一无二的属性 key
let a={ key:'val' } let key = Symbol() a[key]='s' console.log(a.key) console.log(a[key])
二,生成:
方法一:
1,Symbol() 用来生成一个 symbol 值
2,symbol 是一种数据类型,不是对象数据类型,所以不能使用 new Symbol()
3,Symbol() 的参数只是一个描述,所以同样的参数,会生成不同的 Symbol 值
let c = Symbol(); console.log(c); // Symbol() console.log(typeof c); // "symbol" let d = new Symbol(); // Uncaught TypeError: Symbol is not a constructor let d = Symbol('s'); let e = Symbol('s'); console.log(d===e)
方法二:
1,Symbol.for(),如果不存在则创建,存在则返回,所以相同参数会生成相同的 symbol 值
2,Symbol.for()会在全局登记 symbol 值,但 Symbol() 函数不会
3,通过 Symbol.keyFor() 函数可以查询登记过的 symbol 值
let f = Symbol.for('f'); let g = Symbol.for('f'); let h = Symbol('f'); console.log(f===g);// true console.log(f===h);// false console.log(Symbol.keyFor(f));// f console.log(Symbol.keyFor(g));// f console.log(Symbol.keyFor(h));// undefined
三,赋值:
有三种方法给属性赋值
let a={} let key = Symbol() // 第一种 a[key]='test1' console.log(a[key]) // 第二种 a = { [key]:'test2' } console.log(a[key]) // 第三种 Object.defineProperty(a, key, {value: 'test3'}); console.log(a[key])
四,读取:
1,a[key]直接读取
2,for…in和for…of都无法遍历到Symbol值的属性,Object.keys()、Object.getOwnPropertyNames()也无法读取
3,有专门的读取方法:Object.getOwnPropertySymbols(),或者使用Reflect.ownKeys()返回所有类型的属性名
let s1 = Symbol('s1'); let s2 = Symbol('s2'); let b = { [s1]: 's5', [s2]: 's6' } Object.getOwnPropertySymbols(b); b.test = 'test'; Reflect.ownKeys(b);
Leave a Reply