javascript的Symbol类型怎么使用
javascript的Symbol类型怎么使用
这篇“javascript的Symbol类型怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascript的Symbol类型怎么使用”文章吧。
Symbol一种新的原始数据类型,表示独一无二的。是javascript中第七种数据类型。另外六种分别是:undefined、null、String、Number、Object
声明方式
Symbol值通过Symbol函数生成。对象的属性名可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。属性名属于 Symbol 类型的,都是独一无二的,可以保证不会与其他属性名产生冲突。
lets1=Symbol()lets2=Symbol()console.log(s1)//Symbol()console.log(s2)//Symbol()console.log(s1===s2)//false//Symbol函数能接受字符串作为参数,表示对Symbol实例的描述lets1=Symbol('xxx')lets2=Symbol('hhh')console.log(s1)//Symbol(xxx)console.log(s2)//Symbol(hhh)console.log(s1===s2)//false复制代码
Symbol函数前不能使用new命令,会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。相当于是一种特殊的字符串。
Symbol.for()全局定义Symbol
Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。
lets1=Symbol.for('xxx')lets2=Symbol.for('xxx')console.log(s1===s2)//truefunctionfoo(){returnSymbol.for('hello')}constx=foo()consty=Symbol.for('hello')console.log(x===y)//true
Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。区别是,前者会被登记在全局环境中供搜索,后者就不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,不存在才会新建一个值。
Symbol.keyFor()
Symbol.keyFor()方法返回一个已经登记的 Symbol 类型值的key。
consts1=Symbol('foo')console.log(Symbol.keyFor(s1))//undefinedconsts2=Symbol.for('foo')console.log(Symbol.keyFor(s2))//foo
应用场景
作为属性名
由于 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用在对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,防止某一个键被不小心改写或覆盖。
constgrade={张三:{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解决,相当于一个独一无二的字符串conststu1=Symbol('李四')conststu2=Symbol('李四')console.log(stu1===stu2)//falseconstgrade={[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'}
属性遍历
constsym=Symbol('imooc')classUser{constructor(name){this.name=namethis[sym]='imooc.com'}getName(){returnthis.name+this[sym]}}constuser=newUser('www')//forin的方法不能遍历到Symbol属性像被隐藏了for(letkeyinuser){console.log(key)//name}//Object.keys(obj)方法也不能遍历到Symbol属性for(letkeyofObject.keys(user)){console.log(key)//name}//Object.getOwnPropertySymbols(obj)只能获取到Symbol属性for(letkeyofObject.getOwnPropertySymbols(user)){console.log(key)//Symbol(imooc)}//Reflect.ownKeys(obj)对象的属性都能获取到for(letkeyofReflect.ownKeys(user)){console.log(key)//name//Symbol(imooc)}
消除魔术字符串
魔术字符串指的是,在代码中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改成一些含义清晰的变量代替。
functiongetArea(shape){letarea=0switch(shape){case'Triangle':area=1breakcase'Circle':area=2break}returnarea}console.log(getArea('Triangle'))//Triangle和Circle就是魔术字符串。多次出现,与代码形成了“强耦合”,不利于后面的修改和维护。constshapeType={triangle:Symbol(),circle:Symbol()}functiongetArea(shape){letarea=0switch(shape){caseshapeType.triangle:area=1breakcaseshapeType.circle:area=2break}returnarea}console.log(getArea(shapeType.triangle))
以上就是关于“javascript的Symbol类型怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
推荐阅读
-
JavaScript闭包用多会造成内存泄露吗
-
javascript中文乱码如何解决
-
PHP学习第十五天——JavaScript入门DOM对象:二
-
Node.js基本内容和知识点
简单的说node.js就是运行在服务端的JavaScript,起初段定位是后端开发语言,由于技术的不够成熟,一般小型项目...
-
PHP与Node.js:一个史诗般开发者的分享
-
JavaScript 中 find() 和 filter() 方法的区别
JavaScript在ES6上有很多数组方法,每种方法都有独特的用途和好处。在开发应用程序时,大多使用数组方法来获...
-
js怎么跟php结合使用
-
简单说说Node.js和JavaScript
Node.js是一个开源和跨平台的JavaScript运行时环境,在浏览器之外运行V8JavaScript引擎(...
-
前端开发工程师专业技能简历范文
-
JavaScript怎么实现淘宝网图片的局部放大功能