es6-symbol数据类型

Symbol

  • es6中引入了一种新的原始数据类型,Symbol 表示独一无二的值,是类似于字符串的数据类型

  • 特点

    • 值是唯一的,用来解决命名冲突的问题
    • 值不可以与其他数据类型进行运算
    • 定义的对象属性不能使用 for in 循环遍历,但是可以使用 Reflect.ownkeys 来获取对象的所有键名

七种数据类型

  • u:undefined
  • s:string
  • o:object
  • n:num
  • b:boolean

使用方法

  • 创建Symbol
    let s = Symbol();
    console.log(s, typeof s);
  • 括号中的字符串
    // 下面括号中的字符串是一个描述字符串,就是一个标志
    let s2 = Symbol('lmk'); //括号里面的是一个标志,并不是输出的值
    let s3 = Symbol('lmk') //括号里面的是一个标志,并不是输出的值
    console.log(s2 === s3); // false
  • 通过括号中的字符串得出相同的Symbol值
    // 下面创建的,可以通过括号中提供的字符串得出相同的symbol值
    let s4 = Symbol.for('lmk'); // 函数对象
    console.log(s4, typeof s4);
    let s5 = Symbol.for('lmk');
    console.log(s4 === s5); // true

注意

  • 不能和其他数据进行运算

应用

  • 给对象创建属性和方法

  • 定义一个对象

    let game = {
        name: 'lmk',
        up: function() {
            console.log('kml');
        },
        down: function() {
            console.log('kkk');
        }
    }
  • 声明一个新的对象

    // 声明一个对象
    let methods = {
        up: Symbol(),
        down: Symbol()
    };
  • 通过Symbol给对象快速添加 up 和 donw 方法

  • 如果不通过这种方法,之前的 up 和 donw 会被覆盖

// 来给game对象快速添加 up 和 down 这个方法
game[methods.up] = function() {
    console.log('我可以改变形状');
}
game[methods.down] = function() {
    console.log('我可以快速下降');
}
console.log(game); // 可以看到最后添加的两个方法

// 调用的话只需要调用 methods中的方法就可以了
  • 在对象中另一种添加方式
    let yx = {
        name: '守望先锋',
        [Symbol('logo')]: function() {
            console.log('这个世界需要更多的英雄');
        }
    }
    console.log(yx);
    
    // 调用需要为这个方法定义变量
    // 例如 : let logo = [Symbol('logo')] 
    // logo : function() {
    //         console.log('这个世界需要更多的英雄');
    //     }

内置属性

属性值 作用
Symbol.hasInstance 用来定义一个构造对象/类如何识别是否是它的实例
Symbol.isConcatSpreadable 用来配置一个数组对象,能否被展开,值为true时可以,值为false时不可以
Symbol.iterator 用来声明一个对象的默认遍历器 会遍历那些可遍历的对象
Symbol.match 定义了该属性后,在执行 *.match(obj)时,会调用这个属性的对应的函数,如果不是函数会报错
Symbol.replace 和match属性类似 在执行string.replace时,会调用这个属性对应的函数,如果不是函数会报错
Symbol.search 定义了该属性的对象 在执行String.prototype.search方法时,会调用Symbol.search指向的函数
Symbol.species Symbol.species指向一个构造函数。创建衍生对象时,会使用该函数返回的属性
Symbol.split 对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值
Symbol.toPrimitive 用于声明一个值为函数的属性,当一个对象要转换为一个相应的原始(primitive)值时,会调用该函数,该函数接收一个字符串参数(Number,String,Default),Default是可以转成数值,也可以转成字符串
Symbol.toStringTag 对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用
参考博客 https://www.jianshu.com/p/497764b785ab

本博客所有文章是以学习为目的,如果有不对的地方可以一起交流沟通共同学习 邮箱:1248287831@qq.com!