[JavaScript] Symbol类型(一)

379 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 20 天,点击查看活动详情

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()方法可以返回所有类型的键名

// 中括号包裹
let s1 = Symbol('s1');
let obj = {
    [s1]: '哈哈哈!'
}


let obj = {};
Object.defineProperty(obj, s1, { value: '哈哈哈!' });

// 访问
obj[s1] // "哈哈哈!"