JavaScript数据类型 - Symbol
ES5:对象的属性名只能是字符串,当给对象添加新属性时,很容易造成属性名冲突,从而覆盖了原有的属性。
ES6:所以ES6中引入了symbol数据类型,他表示独一无二的值,避免了属性名的冲突,此时对象的属性名可由字符串类型或者symbol类型来定义。
symbol是一种基本数据类型,通过Symbol()函数来返回symbol类型的值,具有唯一性。
语法:Symbol([description])
参数:description可选,字符串类型,表示对symbol的描述,调试时更容易区分。
一、作为普通变量使用
var symbol1 = Symbol();
var symbol2 = Symbol("2");
var symbol2c = Symbol("2"); console.log(typeof symbol1); // symbol
console.log(symbol2 === symbol2c); // false
注意:
1. 不可使用new Symbol()来创建实例,否则会报TypeError,
围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。 然而,现有的原始包装器对象,如 new Boolean
、new String
以及new Number
,因为遗留原因仍可被创建。
2. Symbol
函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol
函数的返回值是不相等的。
3. Symbol值不能与其他类型的值进行运算,除非将symbol值转换为字符串,如String(symbol2)或者symbol2.toString()。
4. Symbol值可转换为布尔值,例如Boolean(symbol2)为true,!symbol2为false,Symbol值只能转换为字符串值或者布尔值。
二、作为对象属性名使用
var sName = Symbol("name");
var obj = {
[sName]: "lily",
sAge: 18
}
// 另外也可这样赋值
// obj[sName] = "lily";
// Object.defineProperty(a, mySymbol, { value: 'Hello!' }); console.log(obj); // {sAge: 18, Symbol(name): "lily"}
console.log(obj[sName]); // lily
注意:
1. Symbol作为对象属性名时,不能使用点运算符,使用点运算符后,这个属性名就是一个普通字符串了,而不是Symbol类型。
2. Symbol属性名具有隐藏性,是不可枚举属性,所以这个属性不能使用for...in、for...of、Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
等方法访问到,
可以通过创建时的原始 symbol 值访问到,或者通过遍历 “Object.getOwnPropertySymbols()
” 返回的数组中得到。
var sName = Symbol("name");
var obj = {
[sName]: "lily",
sAge: 18
}
console.log(obj[sName]); // lily
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(name)]
另一个新的 API,Reflect.ownKeys()
方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
var sName = Symbol("name");
var obj = {
[sName]: "lily",
sAge: 18
}
Reflect.ownKeys(obj); // ["sAge", Symbol(name)]
三、获取description的属性
es2019提供了获取Symbol描述的方法
var sName = Symbol("name");
console.log(sName.description); // name
四、Symbol.for(),Symbol.keyFor()
1. 有时,我们希望重新使用同一个 Symbol 值,Symbol.for()
方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo'); s1 === s2 // true
Symbol.for()
与Symbol()
这两种写法,都会生成新的 Symbol。
它们的区别是,前者会被登记在全局环境中供搜索,后者不会。
Symbol.for()
不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key
是否已经存在,如果不存在才会新建一个值。
比如,如果你调用Symbol.for("cat")
30 次,每次都会返回同一个 Symbol 值,但是调用Symbol("cat")
30 次,会返回 30 个不同的 Symbol 值。
2. Symbol.keyFor()
方法返回一个已登记的 Symbol 类型值的key
。
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo" let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
参考文献:
http://es6.ruanyifeng.com/#docs/symbol
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
JavaScript数据类型 - Symbol的更多相关文章
- 面试官:JavaScript 原始数据类型 Symbol 有什么用?
以前提到 JavaScript 原始数据类型时,我们知道有Number,String,Null,Boolean,Undefined这几种.ES6 引入了新的基本数据类型Symbol和BigInt.今天 ...
- JavaScript 数据类型
JavaScript 数据类型 字符串.数字.布尔.数组.对象.Null.Undefined JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: 一,JavaScript 字符串 ...
- JavaScript数据类型之隐式类型转换
JavaScript的数据类型分为七种,分别为null,undefined,boolean,string,number,object,symbol ( ECMAScript 2015新增).objec ...
- 基本数据类型 Symbol
ES6 规范之前, JavaScript 一共有六种数据类型,分别是五种基本数据类型: string . number , boolean , null , undefined ,和一种引用数据类型: ...
- 每天五分钟-javascript数据类型
javascript数据类型分为基本数据类型与复杂数据类型 基本数据类型包括:string,number,boolean,null,undefined,symbol(es6) 复杂数据类型包括:obj ...
- javascript 数据类型 -- 检测
一.前言 在上一篇博文中 Javascript 数据类型 -- 分类 中,我们梳理了 javascript 的基本类型和引用类型,并提到了一些冷知识.大概的知识框架如下: 这篇博文就讲一下在写代码的过 ...
- 2019-9-24:渗透测试,JavaScript数据类型基础学习
JavaScript 数据类型 值类型(基本类型):字符串(String).数字(Number).布尔(Boolean).对空(Null).未定义(Undefined).Symbol. 引用数据类型: ...
- JavaScript数据类型判断的四种方法
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14416375.html 本文分享了JavaScript类型判断的四种方法:typeo ...
- 【面试题】JS第七种数据类型Symbol详解
JS第七种数据类型Symbol详解 点击打开视频讲解更加详细 一.什么是Symbol? Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值.它是JavaScript中的第 七种 ...
随机推荐
- 永久设置anaconda的环境变量
安装anaconda后都显示install seccessful,可是输入anaconda 终端却显示“未找到命令” 原因是没有添加环境变量,按照如下方式将环境变量添加的安装路径下: emport P ...
- 一个div居于另一个div底部
一个div如何与另一个div底部对齐,方法有很多,比如使用绝对定位 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...
- Echarts Map地图下钻至县级
**准备工作:**1.首先使用vue-cli的脚手架生成vue项目. 2.然后使用npm安装echartsnpm install echarts -S 3.安装完后再mian.js中挂载到vue的实例 ...
- python编程之进程
进程:运行中的程序 进程和操作系统的关系:进程是操作系统调度和资源分配的最小单位,是操作系统的结构基础. 那么为什么要有进程呢? 程序在运行时,会使用各种硬件资源,如果他们之间没有界限,那么程序之间的 ...
- Spring Data Jpa 简单使用事务
对于两张表,需要顺序操作,必须全部表均操作成功才可,否则两张表不操作. 例如,现在有device,collectionpoint两张表,向两张表顺序执行insert操作 SQL如下 INSERT IN ...
- HDU 6623"Minimal Power of Prime"(数学)
传送门 •题意 给你一个大于 1 的正整数 n: 它可以分解成不同的质因子的幂的乘积的形式,问这些质因子的幂中,最小的幂是多少. •题解 定义 $ans$ 表示最终答案: ①如果 $ans \ge 5 ...
- canvas.toDataURL 由于跨域报错的解决方法
关于canvas.toDataURL 由于跨域报错的解决方法 用过canvas,都知道toDataURL这个方法真好用,不仅合成图片用到它,压缩图片也用到它.但有一个问题,就是图片源不能跨域,不然会报 ...
- linux inode 结构
inode 结构由内核在内部用来表示文件. 因此, 它和代表打开文件描述符的文件结构是不 同的. 可能有代表单个文件的多个打开描述符的许多文件结构, 但是它们都指向一个单个 inode 结构. ino ...
- zoj 4124 "Median" (思维?假的图论?)
传送门 来源:2019 年“浪潮杯”第十届山东省 ACM 省赛 题意: 对于一个包含n个数的(n为奇数)序列val[ ],排序后的 val[ (n+1) / 2 ] 定义为 median: 有 n 个 ...
- 2018百度之星初赛B - A,D,F
总结:这一次的百度之星之行到这里也就结束了,充分的认识到了自己的不足啊...果然还是做的题太少,,见识的题型也还太少,对于STL的掌握还是不够到位啊!!(STL大法是真的好,建议大家认认真真的好好学学 ...