ES6之Symbol:让你的代码变得独一无二

以下内容均是参考ES6教程来进行详细解读的~ ES6教程

一、概述

要学习一个新的东西我们首先要了解它出现的原因以及作用,这样才能彻底的掌握它。在ES5中对象的属性名都是字符串,这样很容易造成属性名的冲突,从而出现后面的值覆盖前面的值的情况。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突。如果有一种机制保证每个属性的名字都是独一无二的就好了,这样就从根本上防止了属性名的冲突,这就是ES6引入Symbold的原因!

Symbol是一种新的原始数据类型,表示独一无二的值。它属于Javascript语言的原生数据类型之一,其他数据类型是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、大整数(BigInt ==>用来表示任意精度的整数,因为Number类型只能表示有限范围内的整数,超过范围的整数会丢失经度或溢出,BigInt类型可以处理任意大小的整数,没有范围限制)、对象(Object ==> Object/Array/Function/Date/RegExp/Set/Map)。

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

let s = Symbol();
console.log(typeof s) // "symbol"

上面代码中,变量s就是独一无二的值。typeof运算符的结果表明变量s是Symbol数据类型,而不是字符串之类的其他类型。

注意

  • Symbol()函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,而不是对象所以不能使用new命令来调用。
let s = new Symbol() // TypeError: Symbol is not a constructor
  • 由于Symbol值不是对象所以也不能添加属性,基本上它就是一种类似于字符串的数据类型。

参数

Symbol()函数可以接受一个字符串作为参数,表示对Symbol实例的描述。这主要是为了在控制台显示或者转为字符串时比较容易区分,还有就是在对象中的作为属性名的使用,这个会在后续说到!

let s1 = Symbol('foo');
let s2 = Symbol('bar');

console.log(s1); // Symbol(foo)
console.log(s2); // Symbol(bar)

上述代码中,s1s2是两个Symbol值,如果不加参数它们在控制台的输出都将是Symbol(),不利于区分。有了参数以后就等于为它们加上了描述,输出的时候就能够分清到底是哪一个值。

如果参数是一个对象,就会调用该对象的toString()方法将其转为字符串,然后生成一个Symbol值。

const obj = {
   
    toStirng(){
   
        return 'abc';
    }
}
const sym = Symbol(obj);
console.log(sym) // Symbol(abc)

注意:Symbol()函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol()函数的返回值是不相等的。

// 没有参数的情况
let s1 = Symbol();
let s2 = Symbol();

console.log(s1 === s2) //false 

// 有参数的情况
let s1 = Symbol('foo');
let s2 = Symbol('foo');

console.log(s1 === s2

你可能感兴趣的:(js基础,es6,javascript,开发语言)