您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

javascript数据类型学习之浅析Symbol类型

2024/2/20 1:02:09发布27次查看
本篇文章带大家了解一下es6新增的数据类型:symbol,聊聊symbol类型的声明方式和使用方法,希望对大家有所帮助!
symbol一种新的原始数据类型,表示独一无二的。是javascript中第七种数据类型。另外六种分别是:undefined、null、string、number、object
声明方式symbol值通过symbol函数生成。对象的属性名可以有两种类型,一种是原来就有的字符串,另一种就是新增的 symbol 类型。属性名属于 symbol 类型的,都是独一无二的,可以保证不会与其他属性名产生冲突。【相关推荐:javascript学习教程】
let s1=symbol()let s2=symbol()console.log(s1)//symbol()console.log(s2)//symbol()console.log(s1===s2)//false//symbol函数能接受字符串作为参数,表示对symbol实例的描述let s1=symbol('xxx')let s2=symbol('hhh')console.log(s1)//symbol(xxx)console.log(s2)//symbol(hhh)console.log(s1===s2)//false复制代码
symbol函数前不能使用new命令,会报错。这是因为生成的 symbol 是一个原始类型的值,不是对象。也就是说,由于 symbol 值不是对象,所以不能添加属性。相当于是一种特殊的字符串。
symbol.for()全局定义symbolsymbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 symbol 值。如果有,就返回这个 symbol 值,否则就新建一个以该字符串为名称的 symbol 值,并将其注册到全局。
let s1 = symbol.for('xxx')let s2 = symbol.for('xxx')console.log(s1 === s2) // truefunction foo(){ return symbol.for('hello')}const x=foo()const y=symbol.for('hello')console.log(x === y)//true
symbol.for()与symbol()这两种写法,都会生成新的 symbol。区别是,前者会被登记在全局环境中供搜索,后者就不会。symbol.for()不会每次调用就返回一个新的 symbol 类型的值,而是会先检查给定的key是否已经存在,不存在才会新建一个值。
symbol.keyfor()symbol.keyfor()方法返回一个已经登记的 symbol 类型值的key。
const s1 = symbol('foo')console.log(symbol.keyfor(s1)) // undefinedconst s2 = symbol.for('foo')console.log(symbol.keyfor(s2)) // foo
应用场景作为属性名由于 symbol 值都是不相等的,这意味着 symbol 值可以作为标识符,用在对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,防止某一个键被不小心改写或覆盖。
const grade={ 张三:{address:'qqq',tel:'111'}, 李四:{address:'aaa',tel:'222'}, 李四:{address:'sss',tel:'333'},}console.log(grade)//张三: {address: "qqq", tel: "111"} 李四: {address: "sss", tel: "333"}//对象的key值不能重复 如果有重复 后面的value值就会覆盖前面的//使用symbol解决,相当于一个独一无二的字符串const stu1=symbol('李四')const stu2=symbol('李四')console.log(stu1===stu2)//falseconst grade={ [stu1]:{address:'aaa',tel:'222'}, [stu2]:{address:'sss',tel:'333'},}console.log(grade)//李四:{address:'sss',tel:'222'} 李四:{address:'sss',tel:'333'}console.log(grade[stu1])//李四:{address:'sss',tel:'222'}console.log(grade[stu2])//李四:{address:'sss',tel:'333'}
属性遍历const sym=symbol('imooc')class user{ constructor(name){ this.name=name this[sym]='imooc.com' } getname(){ return this.name+this[sym] }}const user=new user('www')//for in的方法不能遍历到symbol属性 像被隐藏了for(let key in user){ console.log(key)//name }//object.keys(obj)方法也不能遍历到symbol属性for(let key of object.keys(user)){ console.log(key)//name }//object.getownpropertysymbols(obj)只能获取到symbol属性for(let key of object.getownpropertysymbols(user)){ console.log(key)//symbol(imooc) }//reflect.ownkeys(obj)对象的属性都能获取到for(let key of reflect.ownkeys(user)){ console.log(key) //name //symbol(imooc) }
消除魔术字符串魔术字符串指的是,在代码中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改成一些含义清晰的变量代替。
function getarea(shape) { let area = 0 switch (shape) { case 'triangle': area = 1 break case 'circle': area = 2 break } return area}console.log(getarea('triangle'))//triangle和circle就是魔术字符串。多次出现,与代码形成了“强耦合”,不利于后面的修改和维护。const shapetype = { triangle: symbol(), circle: symbol()}function getarea(shape) { let area = 0 switch (shape) { case shapetype.triangle: area = 1 break case shapetype.circle: area = 2 break } return area}console.log(getarea(shapetype.triangle))
一个前端小白,若文章有错误内容,欢迎大佬指点讨论!
【相关视频教程推荐:web前端】
以上就是javascript数据类型学习之浅析symbol类型的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product