• 实习打怪之路:ES6中的Sym详解


    一、什么是Symbol

    Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值。它是JavaScript中的第七种数据类型,与undefined、null、Number(数值)、String(字符串)、Boolean(布尔值)、Object(对象)并列。

    你可以这样创建一个Symbol值:

    1. const a = Symbol();
    2. console.log(a); //Symbol()

    使用Symbol函数可以生成一个Symbol类型的值,但是你不能在调用Symbol时使用new关键字,因为Symbol是基本数据类型,而不是对象。比如下面的写法是错误的:

    1. //报错,Symbol is not a constructor
    2. const a = new Symbol();

    使用Symbol()创建一个Symbol类型的值并赋值给a变量后,你就得到了一个在内存中独一无二的值。现在除了通过变量a,任何人在任何作用域内都无法重新创建出这个值。例如当你这样写:

    const b = Symbol();

    尽管a和b都是使用Symbol()创建出来的,但是它们在内存中看起来却是这样的:

     实际上,a变量拿到了内存中某块内存的唯一引用(这里所说的引用,其实就是该内存的地址)。如果不借助a变量,你不可能再得到这个地址。因此:

    1. a !== b; //a和b持有的是两块内存的引用
    2. const c = a; //手动把a里保存的地址保存在c变量中
    3. a === c; //c和a现在指向同一块内存,因为它们保存了同样的地址

     这种行为看似难以理解,但其实它与对象遵循相同的规则,如:

    1. var a = {};
    2. var b = {};
    3. a !== b; //a和b各自被分配了不同的内存,因此它们保存了不同的地址
    4. //借助变量a,变量c拿到了a指向的那个对象的地址,因此两者相等
    5. var c = a;
    6. a === c;

    但是对于同为基本数据类型的字符串来说,它不遵循类似的规则。

    比如:

    1. var a = "123";
    2. var b = "123";
    3. a === b; //返回true。两者在常量区引用同一个字符串

    可能很多人比较奇怪,一个Symbol类型的变量里面到底保存了什么呢?

    我们看两行代码:

    typeof a === "symbol";

    所以说如果你想问js引擎a的值是多少,引擎只会告诉你它是一个Symbol类型的值。也就是说,Symbol真正存储了什么并不重要,重要的是它的值永远不会与别的值相等。Symbol的中文释义为“标志,符号”,一个Symbol类型的变量只是为了标记一块唯一的内存而存在的。也正是因为这样,Symbol类型的值不参与运算。

  • 相关阅读:
    错误,LNK1107,文件无效或损坏
    C_plus_侯捷课件笔记
    【数据分享】2006-2021年我国城市级别的市容环境卫生相关指标(20多项指标)
    ceph浅谈
    android Selinux 之 platform
    【小笔记】fasttext文本分类问题分析
    【算法|习题总结】算法分析与计算复杂性在线测试Ⅰ
    猿创征文|MySQL基本查询语句的应用(有实例与代码)
    使用 MyBatis 日志插件实现日志记录
    写一篇过往与憧憬:致程序员
  • 原文地址:https://blog.csdn.net/qq_51066068/article/details/125917303