前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Symbol

原创
作者头像
李才哥
修改2021-02-23 14:32:03
7700
修改2021-02-23 14:32:03
举报
文章被收录于专栏:李才哥李才哥

Symbol

概述

ES5 的对象属性名都是字符串,这容易造成属性名的冲突

Symbol的引入,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突

它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)

Symbol函数前不能使用new命令,否则会报错

Symbol 值不是对象,所以不能添加属性

Symbol 值不能与其他类型的值进行运算,会报错

Symbol 值可以显式转为字符串

Symbol 值也可以转为布尔值,但是不能转为数值

作为属性名的 Symbol

由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性

Symbol 值作为对象属性名时,不能用点运算符

实例:消除魔术字符串

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

常用的消除魔术字符串的方法,就是把它写成一个变量。

属性名的遍历

Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回

有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名

Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名

Symbol.for(),Symbol.keyFor()

我们希望重新使用同一个 Symbol 值,Symbol.for方法可以做到这一点

它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值

如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值

Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值

Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key

实例:模块的 Singleton 模式

Singleton 模式指的是调用一个类,任何时候返回的都是同一个实例

如果键名使用Symbol方法生成,那么外部将无法引用这个值,当然也就无法改写。

内置的 Symbol 值

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法

对象的Symbol.hasInstance属性,指向一个内部方法

对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开

对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性

对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值

对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值

对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值

对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值

对象的Symbol.iterator属性,指向该对象的默认遍历器方法。

对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值

对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用Object.prototype.toString方法时,如果这个属性存在,它的返回值会出现在toString方法返回的字符串之中,表示对象的类型

对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • ES5 的对象属性名都是字符串,这容易造成属性名的冲突
      • Symbol的引入,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突
        • 它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)
          • Symbol函数前不能使用new命令,否则会报错
            • Symbol 值不是对象,所以不能添加属性
              • Symbol 值不能与其他类型的值进行运算,会报错
                • Symbol 值可以显式转为字符串
                  • Symbol 值也可以转为布尔值,但是不能转为数值
                  • 作为属性名的 Symbol
                    • 由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性
                      • Symbol 值作为对象属性名时,不能用点运算符
                      • 实例:消除魔术字符串
                        • 魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值
                          • 常用的消除魔术字符串的方法,就是把它写成一个变量。
                          • 属性名的遍历
                            • Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回
                              • 有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名
                                • Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名
                                • Symbol.for(),Symbol.keyFor()
                                  • 我们希望重新使用同一个 Symbol 值,Symbol.for方法可以做到这一点
                                    • 它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值
                                      • 如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值
                                        • Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值
                                          • Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key
                                          • 实例:模块的 Singleton 模式
                                            • Singleton 模式指的是调用一个类,任何时候返回的都是同一个实例
                                              • 如果键名使用Symbol方法生成,那么外部将无法引用这个值,当然也就无法改写。
                                              • 内置的 Symbol 值
                                                • 除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法
                                                  • 对象的Symbol.hasInstance属性,指向一个内部方法
                                                    • 对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开
                                                      • 对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性
                                                        • 对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值
                                                          • 对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值
                                                            • 对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值
                                                              • 对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值
                                                                • 对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
                                                                  • 对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值
                                                                    • 对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用Object.prototype.toString方法时,如果这个属性存在,它的返回值会出现在toString方法返回的字符串之中,表示对象的类型
                                                                      • 对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除
                                                                      领券
                                                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档