JavaScript Symbol对象
JavaScript Symbol对象
Symbol
Symbol对象是es6中新引进的一种数据类型,它的作用非常简单,就是用于防止属性名冲突而产生。
Symbol的最大特点就是值是具有唯一性,这代表使用Symbol类型的值能做独一无二的一些事情。
此外,Symbol没有构造函数,这使得我们不能new它,直接使用即可。
基础知识
声明Symbol
使用Symbol()声明一个独一无二的值。
<script>
"use strict";
let Sym1 = Symbol(); // 独一无二的值
let Sym2 = Symbol();
console.log(typeof Sym1); // symbol
console.log(Sym1 == Sym2); // false
</script>
描述信息
为Symbol的值在声明时添加一段描述信息。
使用description属性可查看描述信息。
注意:即使两个
Symbol的描述信息是一样的也不会有什么问题,因为它仅仅是描述信息而已。
<script>
"use strict";
let Sym1 = Symbol("这是Sym1的描述信息"); // 独一无二的值
let Sym2 = Symbol("这是Sym2的描述信息");
console.log(Sym1.description); // 这是Sym1的描述信息
console.log(Sym2.description); // 这是Sym2的描述信息 </script>
Symbol.for
使用Symbol()来创建值不会进行记录,所以无论值看起来是否一样都不会引用同一份内存地址。
而使用Symbol.for()来创建值则会进行记录,下次再创建相同的值时会直接引用记录的内存地址。
<script>
"use strict";
let Sym1 = Symbol("测试"); // 独一无二的值
let Sym2 = Symbol("测试");
console.log(Sym1 == Sym2); // false
</script>
<script>
"use strict";
let Sym1 = Symbol.for("测试"); // 将这个值的内存地址记录,下次再创建时直接引用内存地址
let Sym2 = Symbol.for("测试");
console.log(Sym1 == Sym2); // true
</script>


Symbol.keyFor
用于返回由Symbol.for()创建的值的描述信息。
如果值没有描述信息则返回undefined。
当然,我们也可以使用description属性来获取描述信息,二者皆可。
<script>
"use strict";
let Sym1 = Symbol.for("测试"); // 将这个值的内存地址记录,下次再创建时直接引用内存地址
let Sym2 = Symbol.for();
console.log(Symbol.keyFor(Sym1)); // 测试
console.log(Symbol.keyFor(Sym2)); // undefined
console.log(Sym1.description); // 测试
console.log(Sym2.description); // undefined
</script>
实际应用
对象属性
Js中的对象(键)如果直接声明就会变成String类型,这在某些程度上可能会引起对象属性冲突问题。
对象的键最好是唯一的,Symbol类型的值无疑是最好的选择。
当我们给想对象的键设置为Symbol类型的值的时候需要注意2点问题。
Symbol声明和访问使用[](变量)形式操作不能使用
.语法因为.语法是操作字符串属性的
<script>
"use strict";
let username = Symbol(); // 将这个值的内存地址记录,下次再创建时直接引用内存地址
let age = Symbol();
let dic = { // 声明时加上 [] 否则会变成String类型 --> "username"
[username]:"云崖",
[age]:18,
};
// 不能使用 . 语法获取值(属性)
console.log(dic[username]); // 云崖
console.log(dic[age]); //
</script>
对象遍历
Symbol类型值不能被 for/in、for/of 遍历操作找到。
以下示例可以看出,找不到两个Symbol类型的键。
<script>
"use strict";
let username = Symbol(); // 将这个值的内存地址记录,下次再创建时直接引用内存地址
let age = Symbol();
let dic = { // 声明时加上 [] 否则会变成String类型 --> "username"
[username]: "云崖",
[age]: 18,
"gender": "男",
};
for (let i in dic) {
console.log(i); // gender
}
// for/of 只能遍历一个迭代对象,不能直接遍历对象。所以我们使用Object.keys(dic)将dic转换为一个迭代对象。
for (let i of Object.keys(dic)) {
console.log(i); // gender
}
</script>
可以使用 Object.getOwnPropertySymbols 获取所有Symbol属性(键)。
注意,这是仅仅获取Symbol的属性(键)。
<script>
"use strict";
let username = Symbol(); // 将这个值的内存地址记录,下次再创建时直接引用内存地址
let age = Symbol();
let dic = { // 声明时加上 [] 否则会变成String类型 --> "username"
[username]: "云崖",
[age]: 18,
"gender": "男",
};
for (let i in Object.getOwnPropertySymbols(dic)) {
console.log(i); // 0 1
}
// for/of 只能遍历一个迭代对象,不能直接遍历对象。所以我们使用Object.keys(dic)将dic转换为一个迭代对象。
for (let i of Object.getOwnPropertySymbols(dic)) {
console.log(i); // (2) Symbol()
}
</script>
也可以使用 Reflect.ownKeys(obj) 获取所有属性(键)包括Symbol类型的属性。
<script>
"use strict";
let username = Symbol(); // 将这个值的内存地址记录,下次再创建时直接引用内存地址
let age = Symbol();
let dic = { // 声明时加上 [] 否则会变成String类型 --> "username"
[username]: "云崖",
[age]: 18,
"gender": "男",
};
for (let i in Reflect.ownKeys(dic)) {
console.log(i); // 0 1 2
}
console.log("*".repeat(20));
// for/of 只能遍历一个迭代对象,不能直接遍历对象。所以我们使用Object.keys(dic)将dic转换为一个迭代对象。
for (let i of Reflect.ownKeys(dic)) {
console.log(i); // gender (2) Symbol()
}
</script>
私有属性
我们可以使用Symbol不能被for/in以及for/of访问的特性,为类制作私有属性以及提供访问接口。
<script>
"use strict";
const sex = Symbol("性别");
class User {
constructor(name, age, gender) {
this[sex] = gender; // 存入类对象中
this.name = name;
this.age = age;
}
getMsg() {
// 我们希望通过提供的API接口来让用户调出gender属性
return `姓名:${this.name},年龄:${this.age},性别:${this[sex]}`
}
}
let u1 = new User("云崖", 18, "男");
console.log(u1.getMsg()); // 只能通过接口来拿到性别 姓名:云崖,年龄:18,性别:男
// 如果循环不管是for/in还是for/of都是拿不到性别的
for (const i in u1) {
console.log(i);
// name
// age
}
</script>
JavaScript Symbol对象的更多相关文章
- JavaScript 复制对象
在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...
- javaScript遍历对象、数组总结(转载)
javaScript遍历对象.数组总结 转载来源 https://www.cnblogs.com/chenyablog/p/6477866.html 在日常工作过程中,我们对于javaScript遍 ...
- JavaScript原生对象及扩展
来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始 ...
- JavaScript 复制对象【Object.assign方法无法实现深复制】
在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...
- JavaScript Set对象
JavaScript Set对象 Set 用于存储任何类型的唯一值,无论是基本类型还是引用类型. 只有值没有键 严格类型检测存储,字符串数字不等同于数值型数字 存储的值具有唯一性 遍历顺序是添加的顺序 ...
- JavaScript 遍历对象、数组总结
在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用! javaScript遍历对象总结 1.使用Objec ...
- javascript 全局对象--w3school
JavaScript全局对象 1. decodeURI()解析某个编码的URI. 2.decodeURInComponent()解析一个编码的URI组件. 3.encodeURI()把字符串编码为U ...
- JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString
JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...
- 从零构建JavaScript的对象系统
一.正统的类与继承 类是对象的定义,而对象是类的实例(Instance).类不可直接使用,要想使用就必须在内存上生成该类的副本,这个副本就是对象. 以Java为例: public class Grou ...
随机推荐
- 修改CentOS7登录欢迎界面信息
vi /etc/issue 添加自己喜欢的内容,保存即可. 特殊字符的含义: \d 本地端时间的日期: \l 显示第几个终端机接口: \m 显示硬件的等级 (i386/i486/i586/i686.. ...
- 硬刚 lodash 源码之路,_.chunk
前置 chunk 函数内部借助其他函数实现,所以从其他函数开始,chunk 在最后. 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节. isObject 判断是否为 Obje ...
- RESTful API 规范(一)
一,简介 DRF 即Django rest framework 二,rest 规范 1 协议 API 与用户通信,总是使用https协议 2 域名 1) 应尽量将API 部署在域名下(这种情况会存在跨 ...
- C++输出三角图形
输出像这样的三角图形 3 1 1 1 1 1 1 1 1 1 1 1 1 ...
- Mac系统权限打开与关闭
打开系统权限: 关闭mac command+R重启 菜单中找到终端 输入命令:csrutil enable 关闭系统权限: 重复以上1-3步骤,第4步时输入:csrutil disable
- Alink漫谈(十) :线性回归实现 之 数据预处理
Alink漫谈(十) :线性回归实现 之 数据预处理 目录 Alink漫谈(十) :线性回归实现 之 数据预处理 0x00 摘要 0x01 概念 1.1 线性回归 1.2 优化模型 1.3 损失函数& ...
- JVM 学习笔记(五)
前言: 前面的文件介绍了JVM的内存模型以及各个区域存放了那些内容,本编文章将介绍JVM中的垃圾回收Garbage Collector,和大家一起探讨一下. 如何确定一个对象是垃圾: 这里介绍两种方法 ...
- Scala 基础(六):Scala变量 (三) 标识符
1 标识符概念 1) Scala 对各种变量.方法.函数等命名时使用的字符序列称为标识符 2) 凡是自己可以起名字的地方都叫标识符 2 标识符的命名规则 Scala中的标识符声明,基本和Java是一致 ...
- scrapy 基础组件专题(九):scrapy-redis 源码分析
下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...
- Java实现导入导出Excel:POI和EasyExcel
文章与CSDN同步,欢迎访问:https://blog.csdn.net/qq_40280582/article/details/107300081 代码地址:https://gitee.com/il ...