Symbol是js第七种数据类型。在es5时,对象的属性都是字符串。并且在多人开发时属性名很容易发生重叠,导致后写会覆盖掉前面的。为了解决这种问题从es6引入了Symbol.
Symbol它并没有一个具体的值,但是它是独一无二的。它跟 react中createRef()的意义很像。this.user=createRef() this.pass=createRef() 它可以写很多个ref,但是每个都不一样。
首先生成一个Symbol,它不需要 new
let cat =Symbol('name')//他的参数是个字符串,代表对Symbol的描述 //第一种写法 let a={} a[cat]='yingduan' //第二种写法 let a={ [cat]:'yingduan' } //第三种写法 let a={} Object.defineProperty(a,cat,{value:'yingduan'}) //上面三种写法是一个效果 a[cat]//'yingduan' //如果你的属性是Symbol的话,必须要用[]来获取,不能用.它的运算符。。//a[Symbol] //属性名的遍历. Object.getOwnPropertySymbol()方法 Object.getOwnPropertySymbol(a)//拿到属性是Symbol,然后放在数组里 //Symbol.for() let b=Symbol.for('foo') let c=Symbol.for('foo') b===c //true //通过Symbol.for 声明的Symbol会提交到全局,并且他们是相同 //但是 通过 Symbol()声明的他们就不是相等的 let b=Symbol('foo') let c=Symbol('foo') b===c //false // Symbol.keyFor(b)//这时它会返回一个已登记的Symbol创建它时描述性的字符串 //Interator(遍历器),为不同的数据结构提供统一的访问机制,任何数据只要部署了interator接口,就可以进行遍历操作 //一个数据结构只要有Symbol.iterator属性就认为是可以用 for...of遍历的 // 对象本身是没有Symbol.iterator属性的,所以我么可以给他手动加一个,然后遍历 let obj ={ [Symbol.iterator]:function(){ return { next:function (){ return { value:1, done:true } } } } } //数组是不用做任何处理就能使用 for...of遍历的,因为原生它就有Symbol.iterator这个属性 //对于类数组的遍历: let arr ={ 0:'a', 1:'b', 2:'c', length:3, [Symbol.iterator]:Array.prototype[Symbol.iterator] } for(let item of arr){ console.log(item)//a,b,c }//注意此方法只针对类数组,对于普通数组是没有效果的。
let cat =Symbol('name')//他的参数是个字符串,代表对Symbol的描述 //第一种写法 let a={} a[cat]='yingduan' //第二种写法 let a={ [cat]:'yingduan' } //第三种写法 let a={} Object.defineProperty(a,cat,{value:'yingduan'}) //上面三种写法是一个效果 a[cat]//'yingduan' //如果你的属性是Symbol的话,必须要用[]来获取,不能用.它的运算符。。//a[Symbol] //属性名的遍历. Object.getOwnPropertySymbol()方法 Object.getOwnPropertySymbol(a)//拿到属性是Symbol,然后放在数组里 //Symbol.for() let b=Symbol.for('foo') let c=Symbol.for('foo') b===c //true //通过Symbol.for 声明的Symbol会提交到全局,并且他们是相同 //但是 通过 Symbol()声明的他们就不是相等的 let b=Symbol('foo') let c=Symbol('foo') b===c //false // Symbol.keyFor(b)//这时它会返回一个已登记的Symbol创建它时描述性的字符串 //Interator(遍历器),为不同的数据结构提供统一的访问机制,任何数据只要部署了interator接口,就可以进行遍历操作 //一个数据结构只要有Symbol.iterator属性就认为是可以用 for...of遍历的 // 对象本身是没有Symbol.iterator属性的,所以我么可以给他手动加一个,然后遍历 let obj ={ [Symbol.iterator]:function(){ return { next:function (){ return { value:1, done:true } } } } } //数组是不用做任何处理就能使用 for...of遍历的,因为原生它就有Symbol.iterator这个属性 //对于类数组的遍历: let arr ={ 0:'a', 1:'b', 2:'c', length:3, [Symbol.iterator]:Array.prototype[Symbol.iterator] } for(let item of arr){ console.log(item)//a,b,c }//注意此方法只针对类数组,对于普通数组是没有效果的。