ES6笔记-symbol

ES6 symbol 是什么

ES5的对象属性名是字符串,这容易造成属性名的冲突。symbol是一种机制,保证每个属性的名字都是独一无二的。这样就从根本上防止属性名冲突。

它是一种原始数据类型Symbol,表示独一无二的值。它属于javaScript语言的原生数据类型之一。其他数据类型是,undefinde,null, 布尔值(Boolean),字符串(String),数值(Number),大整数(BigInt),对象(object)

symbol值通过symbol()函数生成。这也就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突

Symbol()函数不能使用new命令 ,否则会报错。这是因为Symbol是一个原始类型的值,不是对象,所以不能用new命令来调用。Symbol值不是对象,所以也不能添加属性。基本上,它是一种类似字符串的数据类型

Symbol()函数的参数只是对当前Symbol值的描述,因此相同参数的Symbol函数返回值是不相等的

Symbol值不能与其他类型的值进行运算,会报错

Symbol()函数创建symbol值时,可以用参数添加一个描述

但是读取这个方法要将symbol显示转换为字符串

由于每一个symbol值都是不相等的,这意味着只要symbol值作为标识符,用于对象的属性名,就能保证不会出现同名属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键不小心改写覆盖

属性名遍历

symbol值作为属性名,遍历对象的时候,该属性不会出现在for...in,for...of循环中,也不会被object.keys(),object.getownproppertyNames(),json.stringify()返回

但是它也是一个私有属性有一个object.getownPropertysymbols()方法,可以获取指定对象的所有symbol属性名。该方法返回一个数组,成员是当前对象的所有用作属性名的symbol值

reflect.ownkeys()方法阶梯返回所有类型的键名,包括常规键和symbol键名

有时我能希望使用同一个symbol值,symbol.for()方法可以做到这一点。它接受一个字符串作为参数,然后搜索没有以该参数作为名称的symbol值。如果有,就返回这个symbol值,否则就新建一个以该字符串为名称的symbol值,并将其注册到全局

symbol.for()与symbol()这两种写法都会生成新的symbol。它们的区别是,前者会被登记在全局环境中共搜索,后者不会。symbol.for()不会每次调用就返回一个新的symbol类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。

Symbol.keyFor()方法返回一个已登记的symbol类型的key

由于symbol没有登记机制,所以用symbol创建的会返回undefinde

相关推荐
奶昔不会射手几秒前
自定义vue3函数式弹窗
前端·javascript·css
new code Boy7 分钟前
前端全栈之路
前端
牛奶21 分钟前
为什么敲几个字母就能访问网站?DNS原理大揭秘
前端·http·dns
wuhen_n24 分钟前
破冰——建立我们的AI开发实验环境
前端·javascript
HelloReader28 分钟前
Flutter 自适应布局一套代码适配手机和平板(十二)
前端
牛奶31 分钟前
HTTP裸奔,HTTPS穿盔甲——它们有什么区别?
前端·http·https
梓言33 分钟前
tailwindcss构建执行npm exec tailwindcss init -p 报错
前端
哈罗哈皮34 分钟前
龙虾(openclaw)本地快速安装及使用教程
前端·aigc·ai编程
用户231154445305835 分钟前
React中实现“双向绑定”效果的几种方式
前端
HelloReader35 分钟前
Flutter Sliver 高级滚动打造 iOS 通讯录体验(十三)
前端