写点什么

什么?你还不知道 Symbol?

  • 2022 年 7 月 15 日
  • 本文字数:1428 字

    阅读完需:约 5 分钟

前言

ES6 引入了一种新的原始数据类型Symbol表示独一无二的值。它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。

Symbol 的特点

  • Symbol 的值是唯一的,用来解决命名冲突的问题

  • Symbol 值不能与其他数据进行运算

  • Symbol 定义的对象属性不能使用for...in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名

创建 Symbol 的两种方式

创建 Symbol

    // 创建Symbol    let s = Symbol();    console.log(s, typeof s); // Symbol() 'symbol'
复制代码


打印出来的数据跟想象中是不是不一样?是不是觉得s应该是一个很长的东西?这是因为它的唯一性在这里是不可见的,所以我们才看不见。


不要慌,继续往下看,我们继续创建 Symbol。


    let s2 = Symbol('Ned');    let s3 = Symbol('Ned');    console.log(s2 === s3); // false
复制代码


我们现在传入了两个字符串,想看看返回的值是不是一样的,发现是不一样的。


我的理解:虽然传入两个字符串内容一样,但是他们的编号未必一样,啊不,应该是一定不一样。

使用 Symbol.for 创建 Symbol

这样创建的 Symbol 是一个对象。


     let s4 = Symbol.for('Ned');     console.log(s4, typeof s4); // Symbol(Ned) 'symbol'
复制代码


通过Symbol.for创建的,我们可以通过传入同一字符串来得到唯一的 symbol 值的。


    let s4 = Symbol.for('Ned');    let s5 = Symbol.for('Ned');    console.log(s4 === s5); // true
复制代码

【强调】Symbol 值不能与其他数据进行运算

    let a = Symbol();    let b = a + 100;    let c = a + '100';
复制代码


这都是不行的,会直接在浏览器中报错。

Symbol 的基本使用

symbol 的使用场景就是给对象加属性或者方法


    let game = {        name: '石头剪刀布',        ...        up: function() {            console.log('这是up函数');        },        down: function() {            console.log('这是down函数');        }        ...    }
复制代码


现在有一个对象game,我们想往里添加两个方法,分别是updown,但是我们不清楚现在对象中是否已经具有updown两个方法,按照以往的方法,我们是不是应该打开这个对象,去里面一一查找是否具有这两个方法,如果找到了,我们是不是就应该换个名字,如果没找到,我们就可以向内添加方法,但是这个对象结构简单还好,如果稍微复杂一点的话,这个操作就会非常复杂,会耗费许多时间。


在这种应用场景下,我们就应该应用Symbol来创建唯一值,完成这个需求。


    // 声明一个method对象    let methods = {        up: Symbol(),        down: Symbol()    }    // 向game对象中,注入方法    game[methods.up] = function(){        console.log('我要上升!');    }    game[methods.down] = function(){        console.log('我要下降!');    }
复制代码


我们使用这样的方式,给game对象添加方法,是不会破坏game原有的一些属性的,是非常安全快速的。


下面我们打印一下game对象,看一下他内部是什么样子的。


    name: "石头剪刀布"    down: f()    up: f()    Symbol(): f()    Symbol(): f()
复制代码


可以看到,多出了两个 Symbol 函数,没有对原函数造成影响。

数据类型小诀窍

送大家一个记住 JavaScript 数据类型的小诀窍


共八种


USONB: you are so niu bility

U: undefined

S: string symbol

O: object

N: null number

B: boolean bigint


想顺便复习数据类型的话也可以看我的这篇文章:一文带你了解JavaScript的数据类型

最后

希望总结的这些知识可以让大家对 symbol 类型的数据有一个简单的了解。

发布于: 刚刚阅读数: 4
用户头像

公众号:前端成长日记 2021.08.09 加入

还未添加个人简介

评论

发布
暂无评论
什么?你还不知道Symbol?_JavaScript_是乃德也是Ned_InfoQ写作社区