• (五) ES6 新特性 —— Symbol


    CSDN话题挑战赛第2期
    参赛话题:学习笔记

    目录

    1. symbol的创建

    2. Symbol.for()创建

    3. Symbol.keyFor()

    4. Symbol给对象添加属性和方法

    5. Symbol作为对象属性名

    6. symbol的内置属性


    Symbol 基本使用 ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。

    它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。

    (ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。——USONB

    Symbol 特点

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

    1. symbol的创建

    Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

    1. let s = Symbol();
    2. let s1 = Symbol();
    3. console.log(s === s1); //false
    4. console.log(s, typeof s); //Symbol() 'symbol'
    5. let s2 = Symbol('尚硅谷');
    6. let s3 = Symbol('尚硅谷');
    7. console.log(s2, typeof s2); //Symbol(尚硅谷) 'symbol'
    8. console.log(s2 === s3); //false

     每一个symbol的值都不一样,在后续的使用中这一点极大的便利了我们。

    2. Symbol.for()创建

    Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

    1. let s2 = Symbol('尚硅谷');
    2. let s4 = Symbol.for('尚硅谷');
    3. let s5 = Symbol.for('尚硅谷');
    4. console.log(s4 === s2); //false
    5. console.log(s4 === s5); //true

    3. Symbol.keyFor()

    Symbol.keyFor() 返回一个 已登记 的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

    1. let s6 = Symbol.for('尚硅谷');
    2. let key = Symbol.keyFor(s6);
    3. console.log(key);// 尚硅谷

    4. Symbol给对象添加属性和方法

    方法一:

     创建一个对象,里面包含 up、down方法

    1. //向对象中添加方法 up down
    2. let game = {
    3. name: '俄罗斯方块',
    4. up: function () {},
    5. down: function () {},
    6. };

    如果我们此时想给game这个对象再添加方法的话,就必须考虑要设置新的方法名来保证代码的正确性。但其实还有一个方法可以使用,那就是使用symbol类型的方法:

    1. // 声明一个对象;
    2. let methods = {
    3. // 对象里面有两个属性,对应的都是symbol类型的值
    4. up: Symbol('shape'),
    5. down: Symbol('downn'),
    6. };
    7. // 给game扩展方法:
    8. game[methods.up] = function () {
    9. console.log('我可以改变形状');
    10. };
    11. game[methods.down] = function () {
    12. console.log('我可以快速下降!!');
    13. };
    14. // symbol:快速安全的把 up 和 down 方法加入到game中,也不会破坏其原有的一些属性
    15. // 原有的up与down不受影响
    16. console.log(game);

    安全的给game对象新增了方法,不用进入game去考虑方法名重复的问题。

    方法二:

    1. let youxi = {
    2. name: '狼人杀',
    3. // 为这个对象添加独一无二的方法:
    4. [Symbol('say')]: function () {
    5. console.log('我可以发言');
    6. },
    7. [Symbol('zibao')]: function () {
    8. console.log('我可以自爆');
    9. },
    10. // 直接写symbol是不可以的,因为symbol是一个动态的值.而不是一个固定的属性
    11. // Symbol(): function(){
    12. // }
    13. };
    14. console.log(youxi);

    5. Symbol作为对象属性名

    Symbol 作为对象属性名时不能用 . 运算符,要用方括号 [ ]。因为 . 运算符后面是字符串,所以取到的是字符串属性,而不是 Symbol 值属性

    1. let stu = {};
    2. let s = Symbol('key1');
    3. stu[s] = 'kk';
    4. console.log(stu[s]); //kk
    5. console.log(stu.s); //undefined

    6. 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 环境排除。

  • 相关阅读:
    灰色和测试环境打包串台
    六、防御保护---防火墙内容安全篇
    【Python】批量提取图片经纬度并写入csv文件
    使用spring boot集成shardingsphere分库分表简易测试
    大文件分片上传、断点续传、秒传
    MySQLCRUD操作介绍
    各类软件docker安装
    axios 和 fetch
    Java零基础入门-大数
    WPF中获取TreeView以及ListView获取其本身滚动条进行滚动
  • 原文地址:https://blog.csdn.net/a45667/article/details/127088937