Symbol小结

151 阅读1分钟

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-06-07
        @description Symbol小结
    */

壹(序)

JavaScript中进行对象引用时很容易冲突,因为属性名是字符串,稍不注意就声明了相同字符串的属性;所以ES6引入了一个新的数据类型Symbol,用来表示独一无二的值,就不会担心再出现这种问题。

贰(声明使用)

Symbol只能使用Symbol()函数进行声明,可以传入可选参数description(String),用来描述这个Symbol;

因为Symbol是表示独一无二,所以两个看起来一样的Symbol,其实是不相等的;

const symbol1 = Symbol('test');
const symbol2 = Symbol('test');
symbol1 === symbol2; // false

叁(注意点)

  1. Symbol没有构造函数,所以无法使用new
new Symbol(); // Uncaught TypeError: Symbol is not a constructor
  1. 想要使用同一个Symbol值时,使用Symbol.for()进行Symbol值的声明与获取;
// 声明
const sym1 = Symbol.for('test'); 
// 获取
const sym2 = Symbol.for('test');

sym1 === sym2; // true
  1. 使用Symbol.keyFor()可以获取使用Symbol.for()在全局注册的Symbol描述值,必传需要查找键值的某个Symbol参数。
Symbol.keyFor(sym3); // "test"
  1. 使用Object.getOwnPropertySymbols获取对象中所有自身的Symbol属性的数组;类似于Object.getOwnPropertyNames
const obj = {};
obj[Symbol('a')] = 1;
obj[Symbol('b')] = 2;

Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)]
  1. 给对象声明一个Symbol属性时,必须使用方括号,因为.的形式属性名是一个字符串
const obj = {};
const sym = Symbol('a');
obj.sym = 1;

obj; // {sym: 1}

obj[Symbol('a')] = 1;

obj; // {sym: 1, Symbol(a): 1}