ES6-11Symbol:Symbol 特点用法以及11个内置的 Symbol 值

150 阅读2分钟

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它属于 JavaScript 语言的数据类型之一,其他数据类型是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、大整数(BigInt)、对象(Object)。

Symbol 值通过Symbol()函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

Symbol 特点:

        1.Symbol 的值是唯一的,用来解决命名冲突的问题

        2. Symbol 值不能与其他数据进行运算

        3. Symbol 定义 的 对象属 性 不能 使 用 for…in 循 环遍 历 ,但 是可以使用Reflect.ownKeys 来获取对象的所有键名

////创建 Symbol
let s1 = Symbol();
console.log(s1, typeof s1);

//添加标识的 Symbol
let s2 = Symbol('路飞');
let s2_2 = Symbol('路飞');
console.log(s2 === s2_2);

//使用 Symbol for 定义
let s3 = Symbol.for('');
let s3_2 = Symbol.for('路飞');
console.log(s3 === s3_2);

注意:Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值

 Symbol.hasInstance当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法
Symbol.isConcatSpreadable对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于 Array.prototype.concat()时, 是否可以展开。
Symbol.species创建衍生对象时,会使用该属性
Symbol.match当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。
Symbol.replace当该对象被 str.replace(myObject)方法调用时,会返回该方法的返回值。
Symbol.search当该对象被 str.search (myObject)方法调用时,会返回该方法的返回值。
Symbol.split当该对象被 str.split(myObject)方法调用时,会返回该方法的返回值。
Symbol.iterator对象进行 for...of 循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器
Symbol.toPrimitive该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol. toStringTag在该对象上面调用 toString 方法时,返回该方法的返回值
Symbol. unscopables该对象指定了使用 with 关键字时,哪些属性会被 with 环境排除。