这篇“JavaScript的Symbol类型、隐藏属性、全局注册表实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript的Symbol类型、隐藏属性、全局注册表实例分析”文章吧。下面对其使用方法和使用场景做一个简单的介绍。Symbol
类型是JavaScript
中的一种特殊的类型,特殊在所有的Symbol
类型值都互不相同。我们可以使用“Symbol”来表示唯一的值,下面是创建Symbol
对象的案例:这样我们就创建了一个Symbol
类型的值,并把这个值存储在了变量id
中。我们在创建一个Symbol
类型变量的时候,可以在参数中传入一些秒属性的字符串,用于描述这个变量的用途信息。
例如:Symbol
类型在任何时候都是不同的,即使他们拥有相同的描述信息,描述只是一个标签,除此之外就没有别的用途了,例如:这个标签存在的意义,个人认为和Symbol
不能直观的看到内部具体值的特性有关,通过添加一个描述信息,让我们对变量的用途有更直观的了解。JavaScript
中的大多数类型都可以直接转换成字符串类型输出,所以我们不能直观的看到它的值到底是什么,例如我们可以直接用alert(123)
把数字123
转换成字符串弹出。
但是Symbol
类型比较特殊,它不能直接转换,例如:JavaScript
中的Symbol
类型不能转成字符串是由于其内在的防治语言混乱的“语言保护”机制,因为字符串和Symbol
在本质上有着区别,不应该将其中一个转换成另一个。试想一下,如果Symbol
可以转为字符串,那么它就变成了一个生成独一无二字符串的函数,就不再具备独立数据类型的必要。如果我们真的想知道Symbol
变量的值,我们可以使用.toString()
方法,如下所示:或者使用.description
属性,获取描述信息:根据JavaScript
的规范,只有两种类型的值可以作为对象的属性键:字符串Symbol如果使用其他类型,则会隐式的转为字符串类型。对象的键在前面的章节有详细的介绍,这里不再重复。将Symbol
作为键值有两种方法:
例1:例2:以上两个案例展示了在对象中插入Symbol
类型作为键的用法,需要注意的是,在访问属性时需要使用obj[id]
而不是obj.id
,因为obj.id
代表的是obj[‘id’]
。如果我们使用Symbol
作为对象的键会有什么效果呢?Symbol免费云主机域名
非常明显的一个特征是,如果对象中使用Symbol
作为键,那么使用for…in
语句是访问不到Symbol
类型的属性的。举个例子:执行以上代码,得到以下结果:> xiaoming可以发现,[id]
对象的值没有被打印出来,说明在对象属性列表中,使用for … in
会自动忽略Symbol
类型的键。同样的,Object.keys(user)
也会忽略所有的Symbol
类型的键。这样的特性能带来非常有用的效果,例如我们可以创建只能自己能用的属性。虽然我们没有办法直接获取到Symbol
键,但是Object.assign
方法能够复制所有的属性:这并不影响Symbol
的隐藏属性,因为复制后的对象仍然无法获取Symbol
键。由于Symbol
既不能直接转为字符串,我们没有办法直观的获得它的值,又不能通过for … in
获得对象的Symbol
属性,也就是说,如果没有Symbol
变量本身,我们就没有办法获得对象内部的对应属性。因此,通过Symbol
类型的键值,我们可以隐藏属性,这些属性只能我们自己访问,其他人都看不到我们的属性。举个例子:我们在开发的过程中,需要和同事“张三”合作,而这个张三创建了一个非常好用的工具Tool
,Tool
是一个对象类型,我们想白嫖张三的Tool
,并在此基础上添加一些自己的属性。我们就可以通过添加Symbol
类型的键:以上示例展示了如何在别人写好的对象上添加自己的属性,那么为什么要使用Symbol
类型而不是常规的字符串呢?原因如下:对象tool
是别人写好的代码,原则上我们不应该去修改别人的代码,这样会造成风险;避免命名冲突,我们直接使用字符串很有可能会和别人原有的属性键冲突,造成严重的后果;使用Symbol
永远不会发生命名冲突,因为Symbol
都是不同的;别人无法访问Symbol
类型的键,相当于不会和别人的代码冲突;错误示范:
如果我们不使用Symbol
类型,很可能出现以下情况:以上代码由于重复使用”usage”,从而重写了原属性,会造成对象原功能异常。所有的Symbol
变量都是不同的,即使他们有用相同的标签(描述)。
有些时候,我们希望通过一个字符串名称(标签),访问同一个Symbol
对象,例如我们在代码的不同地方访问相同的Symbol
。JavaScript
会维护一个全局的Symbol
注册表,我们可以通过向注册表中插入Symbol
对象,并为对象起一个字符串名称访问该对象。向注册表插入或者读取Symbol
对象需要使用Symbol.for(key)
方法,如果注册表中有名为key
的对象,就返回该对象,否则就插入新对象再返回。举个例子:我们通过Symbol.for(key)
就能以全局变量的方式使用Symbol
对象,并使用一个字符串标记对象的名字。相反的,我们还可以使用Symbol.keyFor(Symbol)
反向的从对象获取名称。举个例子:Symbol.keyFor()
函数只能用在全局Symbol
对象上(使用Symbol.for
插入的对象),如果用在非全局对象上,就会返回undefined
。举个例子:JavaScript
有许多系统Symbol
,例如:Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
它们各有用途,我们在后面的会逐步介绍道这些独特的变量。以上就是关于“JavaScript的Symbol类型、隐藏属性、全局注册表实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。
本篇内容主要讲解“C语言中双指针算法如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中双指针算法如何使用”吧!2.1 解题思路利用双指针,定义一个指针i和一个指针j让i开始走,固定住j,然后我们利用一个…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。