[JavaScript] Symbol类型(一)

本文介绍了JavaScript ES6中新增的Symbol类型,阐述了其用于解决属性名冲突的机制,展示了如何生成、复用和使用Symbol,以及其在对象属性、遍历和全局注册表中的应用。

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...infor...of遍历,也不会被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回; Object.getOwnPropertySymbols()方法,可以获取指定对象的所有 Symbol 属性名。

    Reflect.ownKeys()方法可以返回所有类型的键名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值