es6之symbol

142 阅读3分钟

什么是symbol?

在JavaScipt中有两种类型的数据类型:基本数据类型和复杂数据类型:
        基本数据类型包含字符串(String)数字(Number)布尔(Boolean)空(Null)未定义(Undefined),symbol;
        复杂数据类型(对象类型)包含对象(Object),数组(Array),函数(function)以及两个特殊的类型正则(Reg)日期(Date);
symbol是js中的第7种基本数据类型,是es6中新增加的一种基本数据类型,它被用来表示一个独一无二的值。

symbol的使用

在js中你可这样创建一个symbol:

        const a = Symbol();
        console.log(a);  //Symbol()
        
        const a1 = Symbol(123);
        console.log(a1); //Symbol(123)
        
        检测数据类型:
        console.log(typeof (a, a1)); //symbol

下面我把相同的值赋给不同的symbol:

        const a = Symbol(1);
        const b = Symbol(1);
        console.log(a, b);//Symbol(1) Symbol(1)
        
        //判断是否相等
        console.log(a == b); //false

尽管它们的值是一样的,但是打印出来的判断结果却是false,它们在栈内存中看起来是这样的,这正是它的特性:一个Symbol类型的变量只是为了标记一块唯一的内存而存在的;

image.png

Symbol的主要作用
因为Symbol独一无二的特性,所以使用symbol给对象命名,可以保证对象属性不重名;
        使用symbol作为对象的属性名:

        const name = Symbol();
        const age = Symbol();
        let xiaoming = {
            [name]: '小明',
            [age]: 18,
        }
        console.log(xiaoming); //Symbol(): "小明";Symbol(): 18

Symbol的内置属性值
Symbol.hasInstance:其它对象使用instanceof运算符的时候会使用该属性名指向的内部方法。
Symbol.isConcatSpreadable:可以直接定义为对象属性或继承而来,它是布尔类型。它可以控制数组或类似数组(array-like)的对象的行为:
        1.对于数组对象,默认情况下,用于concat时,会按数组元素展开然后进行连接(数组元素作为新数组的元素)。重置Symbol.isConcatSpreadable可以改变默认行为。
        2.对于类似数组的对象,用于concat时,该对象整体作为新数组的元素,重置Symbol.isConcatSpreadable可改变默认行为。

Symbol.species:species 访问器属性允许子类覆盖对象的默认构造函数。

Symbol.match:指定了匹配的是正则表达式而不是字符串。String.prototype.match() 方法会调用此函数。此函数还用于标识对象是否具有正则表达式的行为。 比String.prototype.startsWith()String.prototype.endsWith() 和 String.prototype.includes() 这些方法会检查其第一个参数是否是正则表达式,是正则表达式就抛出一个TypeError。现在,如果 match symbol设置false(或者一个 假值),就表示该对象不打算用作正则表达式对象。

Symbol.replace:这个属性指定了当一个字符串替换所匹配字符串时所调用的方法。

Symbol.search:指定了一个搜索方法,这个方法接受用户输入的正则表达式,返回该正则表达式在字符串中匹配到的下标,这个方法由以下的方法来调用 String.prototype.search()。

Symbol.split:指向 一个正则表达式的索引处分割字符串的方法。

Symbol.iterator:为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。

Symbol.toPrimitive:是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。

Symbol.toStringTag:是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里。

Symbol.unscopables:指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。