[JavaScript]Symbol数据类型介绍与自己的理解

134 阅读5分钟

我正在参与掘金创作者训练营第6期, 点击了解活动详情

  • 本次我选择的方向是: 新特性、新方法介绍:在写文章的同时还能让你学习新东西(适合新手)

新的数据类型Symbol

在我以前的JavaScript学习中,了解到了两大类数据类型

1.基本数据类型(值类型)

类型中文
Number数值数字
String字符串文本
Boolean布尔(逻辑)true /false
Null/
Undefined未定义/

2.复杂数据类型(引用数据类型)

类型中文
Object对象
Array数组
Function函数

由此在还没有了Symbol的具体信息前,我提出以下四个问题,也是我接下来学习了解的Symbol的先后步骤

 1.Symbol是属于普通数据类型还是复杂数据类型?如果它是普通数据类型,它的值是什么?  
 
 2.JavaScript作为一门不太严谨的脚本语言,它的一些新特性有些来自其他语言,Symbol是吗?

 3.Symbol作为新的数据类型它的声明方式是什么样的?
 
 4.Symbol产生的原因是什么?它能解决什么问题?它的应用场景是什么?

 

1.Symbol是属于普通数据类型还是复杂数据类型?如果它是普通数据类型,它的值是什么?

通过查询MDN我知道了Symbol是属于基本数据类型,Symbol() 函数会返回 symbol 类型的值.

但是官方生硬的语言让我摸不着头脑,我决定调出VS code实践一番:

  • 测试代码如下 我分别给a和b赋了Symbol()和Symbol(666)的值,在控制台打印
    <script>
        const a=Symbol()
        const b=Symbol('666')
        console.log(a);
        console.log(b);
    </script>
  • 控制台输出如下:

image.png

  • 可以看出输出颜色是红色,不是字符串的黑色,也不是数值和布尔型的蓝色,由此看来真的是一种新的数据类型
  • 也没有对象和数组,函数类型的向右展开的箭头说明不是复杂数据类型,而是基本数据类型

image.png

  • 控制输出可以看出symbol的值是就是赋给变量的值,如果Symbol()小括号中没有内容则为Symbol(),如果Symbol()小括号中有内容则为Symbol(内容)

2.Symbol来自其他语言吗?

我查询到Symbol用来表示一个独一无二的值,

Symbol是JavaScript独创的,在其他语言中没有这个数据类型

3.Symbol作为新的数据类型它的声明方式是什么样的?

  • let 变量名=Symbol(参数),注意参数为字符串
  • Symbol没有new 构造函数的创造方法 会报错
  • 这一点很奇怪,我要试一下,代码如下:
        let a=new Symbol()
        console.log(a)

image.png

  • 确实会出错
  • MDN解释说:作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。
  • 所以我们只能使用let 变量名=Symbol(参数)的方法来声明Symbol类型

4.Symbol产生的原因是什么?它能解决什么问题?它的应用场景是什么?

  • 🏆Symbol产生的原因是:
  • 在对象中我们的属性名是字符串类型,这样会导致当属性名重复时,会导致原有的属性名的属性值被覆盖.
  • 为了解决这个问题,JavaScript因此创造了Symbol类型
  • Symbol这个单词中文意思是标志,符号的意思
  • 🏆Symbol作用是用来表示一个独一无二的值,这也和含义中的标志符号相符合,表示独一无二的标识符
  • MDN解释:每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。
  • 🏆Symbol能解决什么问题?
  • Symbol是为了解决,字符串类型导致的属性名相同时,数据出错的问题
  • 而Symbol是唯一的标识符,即使Symbol()中的参数相同,两个Symbol也不相同
  • 为了更好的理解,我敲了代码如下:
        const a=Symbol('x666')
        const b=Symbol('x666')
        const c='x666'
        const d='x666'
        console.log(a);
        console.log(b);
        console.log(c);
        console.log(d);
        console.log(c===d);
        console.log(a==b);
        console.log(a===b);

控制台输出如下:

image.png 我们看到:

  • 字符串类型的c,d,字符串内容相同,因此c===d值为true
  • Symbol类型的a,b,即使参数相同,无论是a==b还是,a===b都为false,说明a,b值不相同
  • 符合Symbol是唯一的标识符,即使Symbol()中的参数相同,两个Symbol也不相同的理解

🏆那么Symbol的应用场景是什么呢?

1.首先是上面多次提到的Symbol作为对象的属性名,来避免属性名重复导致的属性值覆盖问题 实现方法如下:

        let sml = Symbol('姓名')
        let obj = {
            [sml]: '李白',
        }
        console.log(obj);
        // 错误修改方法
        obj[Symbol('姓名')]='张三'
        console.log(obj);
        // 正确修改方法
        obj[sml]='张三'
        console.log(obj);

控制台输出如下:

image.png 由此看出:

  • 1.Symbol是唯一的标识符,即使Symbol()中的参数相同,两个Symbol也不相同
  • 即使第一次修改的时候Symbol的参数也为'姓名',但是仍然在对象中增加了新的键值对,而没有达到修改属性值的目的
  • 2.正确的修改属性值得方法为,对原来作为属性名的变量sml,使用obj[sml]='张三'来修改属性值

2.其他应用场景:

  • 以我作为初学者的理解,以下的应用场景我难以理解,先写下来,以待后期功力提升再来补足😭
  • 消除魔法字符
  • 使用Symbol来替代常量
  • 模拟类的私有方法

部分查询资料网站如下:

MDN

菜鸟教程