86   JS

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

Your email address will not be published. Required fields are marked *