Symbol类型

298 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

一、Symbol类型

ECMAScript 6新增了第六种原始类型Symbol(符号)类型。Symbol类型是唯一的并且是不可修改的,并且也可以用来作为Object 的 key值。

Symbol类型的变量是通过调用Symbol()函数生成的:

Symbol([description])
  • description : 可选的字符串。Symbol 的描述,可用于调试但不能访问 Symbol 本身。

值得注意的是,由于Symbol类型是原始类型,是不能通过new Symbol()来创建对象的。

示例代码如下:

/*
    Symbol 类型是ES6 新增的第六种原始类型
    let symbol = Symbol()
*/
let symbol1 = Symbol();
console.log(typeof symbol1);

let symbol2 = Symbol('xxx');
console.log(symbol2);

let symbol3 = Symbol(10);
console.log(symbol3);

//修改变量的值
symbol3 = Symbol(20);
console.log(symbol3)

Symbol 的注意事项

当使用 Symbol 值进行类型转换时需要注意一些事情:

  • 尝试将一个 symbol 值转换为一个 number 值时,会抛出一个 TypeError 错误。
  • Object(symbol) == symbol 表达式的结果返回 true。
  • 阻止从一个 symbol 值隐式地创建一个新的 string 类型的属性名 。

二、Symbol的方法

(1)Symbo.for() 方法

该方法会根据给定的键 ket ,来从运行时的 symbol 注册表中找到队应的 symbol。如果找到了,则返回它。否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。

Symbol.for(key)
  • key : 一个字符串,作为 symbol 注册表中与某 symbol 关联的键。

示例代码如下:

/*
    Symbol.for() 方法
    * 作用 - 从Symbol类型中查找指定的key
        * 如果存在这个key的话,返回
        * 如果不存在这key的话,创建
*/
let symbol = Symbol.for('hello');//创建
console.log(symbol);
let result = Symbol.for('hello');//查找
console.log(result);

Symbol()不同的是,用Symbol.for()方法创建的的 symbol会被放入一个全局 symbol注册表中。

(2)Symbo.keyFor() 方法

该方法用来获取 symbol 注册表中与某个symbol 关联的键。

Symbol.keyFor(key)
  • key : 一个字符串,作为 symbol 注册表中与某 symbol 关联的键。

Symbol 与 for…in

使用Symbol 作为对象的属性名出现,是不可枚举的。

var obj = {};
//使用Symbol 作为对象的属性名出现,是不可枚举的。
obj[Symbol('a')] = 'a';
obj[Symbol('b')] = 'b';
obj['c'] = 'c';
obj.d = 'd';

for (var i in obj ){
    console.log(i);// c d
}