• Symbol基本数据类型


    目录

    前言

    一、创建Symbol值

    二、Symbol数据类型的作用

    1、解决命名冲突

    2、消除魔术字符串

    三、全局注册表


    前言

    ES6引入的一种新的原始数据类型Symbol,表示独一无二的值。Symbol函数可以接受参数,表示对于这个唯一值的描述,属于基本数据类型,Symbol()函数会返回symbol类型的值。

    一、创建Symbol

    Symbol是一个函数,不需要使用new关键字来创建

    1. let sy1 = Symbol();
    2. console.log(sy1); //Symbol()
    3. console.log(typeof sy1); //symbol

    Symbol函数还可以接收参数: 

    1. let sy1 = Symbol('hello');
    2. console.log(sy1); //Symbol(hello)
    3. console.log(typeof sy1); //symbol

    Symbol表示独一无二的值,即使取一样的参数,两个变量也不相等

    1. let sy1 = Symbol('hello')
    2. let sy2 = Symbol('hello')
    3. console.log(sy1 === sy2); //false

    二、Symbol数据类型的作用

    1、解决命名冲突

    例子:
    当我们想要给一个对象添加新属性时,如果我们担心属性名重名,就可以使用Symbol数据类型。

    1. // 声明两个Symbol类型的变量
    2. let sy1 = Symbol('name');
    3. let sy2 = Symbol('age');
    4. let obj = {
    5. name: "zhangsan",
    6. age: 12,
    7. // 属性名是变量名时使用中括号
    8. [sy1]: 'lisi',
    9. [sy2]: 18,
    10. [Symbol('email')]: '888888@qq.com'
    11. };
    12. // 访问方式,用中括号访问
    13. console.log(obj[sy1]); //lisi
    14. console.log(obj[sy2]); //18
    15. console.log(obj[Symbol('email')]); //undefined

    注意:当属性名是变量时,我们需要使用中括号括起来。

    访问方式也是直接使用中括号访问。

    上述代码,我们可以使用中括号访问到sy1和sy2,但是访问不到 [Symbol('email')],这时候我们可以通过Object.getOwnPropertySymbols()方法来访问该属性值,该方法返回一个包含给定对象所有自有的Symbol值的属性(包括不可枚举的Symbol值属性)组成的数组。

    1. let res = Object.getOwnPropertySymbols(obj)
    2. console.log(res); //[ Symbol(name), Symbol(age), Symbol(email) ]
    3. console.log(obj[res[2]]); //888888@qq.com

    注意:使用for...in循环访问不到symbol值

    1. for(let key in obj){
    2. console.log(key);
    3. }
    4. 输出结果:
    5. name
    6. age

    总结:
    1、for in循环访问不到symbol值

    2、获取symbol变量/值,使用getOwnPropertySymbols方法

    3、如何访问属性对应属性值 obj[res[1]]

    2、消除魔术字符串

    魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。

    例子:
    我们封装一个求各种图形的面积的函数,代码如下所示:

    1. function test(shape, options) {
    2. let area = 0;
    3. switch (shape) {
    4. case 'triangle':
    5. area = .5 * options.width * options.height;
    6. break;
    7. case 'square':
    8. area = options.width * options.height;
    9. break;
    10. case 'circle':
    11. area = Math.PI * Math.pow(options.r, 2);
    12. break;
    13. default:
    14. area = -1;
    15. }
    16. return area
    17. }
    18. console.log(test('triangle', {width: 100, height: 100, r: 100}));

    可以看到代码中多次出现了具体的字符串,但我们改变函数中的字符串时,那么调用函数时的实参也需要做出改变,这样并不方便,而且如果我们要求更多图形的面积,那么我们命名的字符串很有可能会发生重复,这样调用函数就会得到错误的结果。

     因此我们最好使用变量替代这些字符串:

    1. function test(shape, options) {
    2. let area = 0;
    3. switch (shape) {
    4. case Shape.triangle:
    5. area = .5 * options.width * options.height;
    6. break;
    7. case Shape.square:
    8. area = options.width * options.height;
    9. break;
    10. case Shape.circle:
    11. area = Math.PI * Math.pow(options.r, 2);
    12. break;
    13. default:
    14. area = -1;
    15. }
    16. return area
    17. }
    18. let Shape = {
    19. triangle: Symbol('三角形'),
    20. square: Symbol('三角形'),
    21. circle: Symbol('圆形')
    22. }
    23. console.log(test(Shape.triangle, {width: 100, height: 100, r: 100}));

    三、全局注册表

    与Symbol() 不同的是,用 Symbol.for() 方法创建的 symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 并不是每次都会创建一个新的 symbol,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个。

    例子:
    不使用Symbol.for() 方法:

    1. let sy1 = Symbol('one');
    2. let sy2 = Symbol('one');
    3. console.log(sy1 === sy2); //false

    使用Symbol.for() 方法:

    1. let sy1 = Symbol.for('one');
    2. let sy2 = Symbol.for('one');
    3. console.log(sy1 === sy2); //true

    我们可以使用Symbol.keyFor()方法检测symbol值是否在全局注册表中注册过。返回对于symbol的描述或者undefined

    1. let sy1 = Symbol.for('hello');
    2. console.log(Symbol.keyFor(sy1)); //hello
    3. let sy2 = Symbol('world');
    4. console.log(Symbol.keyFor(sy2)) //undefined

  • 相关阅读:
    基于JAVA个人信息管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    网络安全学习:系统基础命令操作
    Bootstrap的CSS类积累学习
    Coredump
    C语言中的3种注释方法
    SpringBoot监听redis Key变化事件详解
    【TensorFlow&PyTorch】loss损失计算
    代码随想录 | Day7
    vue 设置定时器在某个时间段执行
    Java异常、继承结构、处理异常、自定义异常、SpringBoot中全局捕获处理异常
  • 原文地址:https://blog.csdn.net/lq313131/article/details/126874813