Symbol类型
首先要知道Symbol是Es6新增的一种原始数据类型;
其次,他的目的就是防止属性名冲突,以前对象属性名都是字符串,现在又新增了Symbol类型;
可以理解为它是跟字符串一样的原始数据类型;区别就是他是独一无二的;因为每个symbol数据都是独一无二的,所以用它做对象属性名可以避免属性名冲突;
就是说:可以有两个相同的字符串,但不会有两个一样的symbol.
1、符号的基本用法
符号值通过Symbol()函数生成
let symb = Symbol()
console.log(typeof symb) // symbol
Symbol()函数不能与 new 关键字一起作为构造函数使用。这样做是为了避免创建符 号包装对象
2、使用全局符号注册表
上面讲了,每个符号值都是不同的,那么如果想复用一个符号值怎么办呢?
-
Symbol.for() 接收一个字符串参数,拿着这个字符串在全局环境中查找有没有对应的符号值,有就返回其符号实例;没有找到就生成一个新的符号实例添加到全局中。
-
Symbol.keyFor()
Symbol.keyFor()的作用是查找在全局注册过的符号,也就是通过Symbol.for()创建并全局登记的符号; 找到就返回符号对应的字 符串键,没有就返回undefined
let s1 = Symbol('123');
let s2 = Symbol.for('123');
console.log(Symbol.keyFor(s2)); // 123
let s3 = Symbol('456')
console.log(Symbol.keyFor(s3)) // undefined
3、使用符号作为属性
因为每个符号值都是独一无二的,所以用符号当做对象属性可以避免属性冲突;
使用符号当做属性时,与字符串属性的区别:
-
符号属性使用中括号包裹或使用Object.defineProperty()/Object.defineProperties()定义的属性
-
使用中括号访问符号属性,不能用点,因为点的都是字符串
-
符号属性不能被
for...in、for...of遍历,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回;Object.getOwnPropertySymbols()方法,可以获取指定对象的所有Symbol属性名。Reflect.ownKeys()方法可以返回所有类型的键名
本文介绍了JavaScript ES6中新增的Symbol类型,阐述了其用于解决属性名冲突的机制,展示了如何生成、复用和使用Symbol,以及其在对象属性、遍历和全局注册表中的应用。
1372

被折叠的 条评论
为什么被折叠?



