当前位置: 首页 > 后端技术 > Node.js

ES6的Symbol数据类型学习

时间:2023-04-03 19:49:47 Node.js

新的原始数据类型:Symbol,表示一个唯一值其他数据类型包括undefined,null,string,number,boolean,object基础知识lets=Symbol()//注意不能用new,因为它不是对象typeofs//'symbol'lets1=Symbol('foo')s1//Symbol(foo)//Symbol参数是一个对象,会调用该对象的toString()方法,然后是一个Symbol值constobj={toString(){return'abc'}}constsym=Symbol(obj)sym//Symbol(abc)lets2=Symbol('foo')s1===s2//false//Symbol值无法操作控制台.log('yoursymbol'+s1)//TypeError//SymbolcanbeexplicitlyconvertedtoastringString(s1)sym.toString()//'Symbol(foo)'//SymbolcanbeconvertedtoaBooleanvalue,但不是Boolean(s)//true!s//falseNumber(s)//TypeError可以防止键被重写或覆盖。当用Symbol值定义属性时,Symbol值必须放在方括号中。letmySym=Symbol()leta={}a[mySym]='hello'leta={[mySym]:'hello'}//注意点运算符,此时mySym是一个字符串a.mySym='hello'a[mySym]//undefineda['mySym']//遍历'hello'属性名Symbol作为属性名,不会出现在for...in和for...的循环,也不会被Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()return使用,有一个Object.getOwnPropertySymbols方法获取Symbol属性名letobj={}letfoo=Symbol('foo')对象t.defineProperty(obj,foo,{value:'foobar'})for(letiinobj){console.log(i)//无输出}Object.getOwnPropertyNames(obj)//[]Object.getOwnPropertySymbols(obj)//[Symbol(foo)]还有一个新的APIReflect.ownKeys()可以返回所有类型的键名,包括常规键名和Symbol键名letobj={[Symbol('my_key')]:1,enum:2,nonEnum:3}Reflect.ownKeys(obj)//['enum','nonEnum',Symbol(my_key)]lets1=Symbol.for('foo')//不会每次都返回一个调用了Symbol类型的Newvaluelets2=Symbol.for('bar')//调用30次,每次返回相同的Symbol值,但是Symbol()会返回30个不同的Symbol值s1===s2//true//返回已注册Symbol类型值的keylets1=Symbol.for('foo')Symbol.keyFor(s1)//'foo'lets2=Symbol('foo')Symbol.keyFor(s2)//不明确的