xiaokeqi / i-learned

1 stars 0 forks source link

symbol #13

Open xiaokeqi opened 5 years ago

xiaokeqi commented 5 years ago

在es6出现之前,js总共有6种类型,其中5种是基本类型。boolean、number、string、undefined、null、object。es6出现后,symbol诞生。 symbol是什么? symbol 被引入的原因是为了保证每个属性名都是独一无二的,都是不冲突的。即,symbol表示独一无二的值

typeof Symbol() // symbol
let s = Symbol()
let t = Symbol()
s==t //false

保证属性名独一无二,常用于对象 如,

let obj1 = {name: 'dandan', age: 23};
let obj2 = {name:'xiaoqi',sex:'man'};
let obj3 = Object.assign(obj1,obj2);//{name: "xiaoqi", age: 23, sex: "man"}

其中obj1中name:'dandan'丢失了 这个使用通过用symbol,就可以防止这样的情况,如下

let obj1 = {
    [Symbol('name')]: 'dandan',
    age: 23
}
let obj2 = {
    [Symbol('name')]: 'xiaoqi',
    sex: 'man'
}
let obj3 = Object.assign(obj1, obj2) 
//{age: 23, sex: "man", Symbol(name): "dandan", Symbol(name): "xiaoqi"}

需要注意的是,symbol作为属性名,不能被for in ,for of循环遍历,也不会被Object.keys(),Object.getOwnPropertyNames(),JSON.stringify返回。他只能通过Object.getOwnPropertySymbols获得。 如下:

Object.getOwnPropertySymbols(obj3)
// [Symbol(name), Symbol(name)]