Js中Symbol对象
Js中Symbol对象
ES6引入了一种新的基本数据类型Symbol,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法,其静态属性会暴露几个内建的成员对象,它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法new Symbol()。每个从Symbol()返回的symbol值都是唯一的,一个symbol值能作为对象属性的标识符。
描述
对于每一个Symbol的值都是不相等的,所以Symbol作为对象的属性名,可以保证属性不重名。该数据类型通常被用作一个对象属性的键值,例如当想使对象属性的键为私有值时。symbol类型的键存在于各种内置的JavaScript对象中,同样自定义类也可以这样创建私有成员。symbol数据类型具有非常明确的目的,并且因为其功能性单一的优点而突出,一个symbol实例可以被赋值到一个左值变量,还可以通过标识符检查类型,这就是其全部特性。一个具有数据类型symbol的值可以被称为符号类型值,在JavaScript运行时环境中,一个符号类型值可以通过调用函数Symbol()创建,这个函数动态地生成了一个匿名,唯一的值。Symbol类型唯一合理的用法是用变量存储symbol的值,然后使用存储的值创建对象属性。
let s = Symbol();
let s1 = Symbol("s");
let s2 = Symbol("s");
console.log(s === s1); //false
console.log(s1 === s2); //false
let obj = {};
let prop = Symbol();
obj[prop] = 1;
console.log(obj[prop]); // 1
console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol()]
console.log(Reflect.ownKeys(obj)); // [Symbol()]
属性
Symbol.length: 长度属性,值为0。Symbol.prototype:symbol构造函数的原型。Symbol.iterator: 返回一个对象默认迭代器的方法,被for...of使用。Symbol.match: 用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用,被String.prototype.match()使用。Symbol.replace: 替换匹配字符串的子串的方法,被String.prototype.replace()使用。Symbol.search: 返回一个字符串中与正则表达式相匹配的索引的方法,被String.prototype.search()使用。Symbol.split: 在匹配正则表达式的索引处拆分一个字符串的方法,被String.prototype.split()使用。Symbol.hasInstance: 确定一个构造器对象识别的对象是否为它的实例的方法,被instanceof使用。Symbol.isConcatSpreadable: 布尔值,表明一个对象是否应该flattened为它的数组元素,被Array.prototype.concat()使用。Symbol.unscopables: 拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。Symbol.species: 一个用于创建派生对象的构造器函数。Symbol.toPrimitive: 一个将对象转化为基本数据类型的方法。Symbol.toStringTag: 用于对象的默认描述的字符串值,被Object.prototype.toString()使用。
方法
Symbol.for()
Symbol.for(key)
Symbol.for(key)方法会根据给定的键key,来从运行时的symbol注册表中找到对应的symbol,如果找到了就返回它,否则就新建一个与该键关联的symbol,并放入全局symbol注册表中。和Symbol()不同的是,用Symbol.for()方法创建的的symbol会被放入一个全局symbol注册表中。当然Symbol.for()并不是每次都会创建一个新的symbol,它会首先检查给定的key是否已经在注册表中了。假如是则会直接返回上次存储的那个,否则它会再新建一个。
key: 一个字符串,作为symbol注册表中与某symbol关联的键,同时也会作为该symbol的描述。
var s1 = Symbol.for();
var s2 = Symbol.for("s");
var s3 = Symbol.for();
var s4 = Symbol.for("s");
console.log(s1 === s3); // true
console.log(s2 === s4); // true
Symbol.keyFor()
Symbol.keyFor(sym)
Symbol.keyFor(sym)方法用来获取全局symbol注册表中与某个symbol关联的键,如果全局注册表中查找到该symbol,则返回该symbol的key值,返回值为字符串类型,否则返回undefined。
sym: 必选参数,需要查找键值的某个Symbol。
var s1 = Symbol();
var s2 = Symbol.for("s");
var key1 = Symbol.keyFor(s1);
var key2 = Symbol.keyFor(s2);
console.log(key1); // undefined
console.log(key2); // s
Symbol.prototype.toString()
symbol.toString()
toString()方法返回当前symbol对象的字符串表示,Symbol对象拥有自己的toString方法,因而遮蔽了原型链上的Object.prototype.toString(),symbol原始值不能转换为字符串,所以只能先转换成它的包装对象,再调用toString()方法。
var s = Symbol.for("s");
console.log(s.toString()); // Symbol(s)
console.log(Object(Symbol("s")).toString()); // Symbol(s)
Symbol.prototype.valueOf()
symbol.valueOf()
valueOf()方法返回当前symbol对象所包含的symbol原始值。在JavaScript中,虽然大多数类型的对象在某些操作下都会自动的隐式调用自身的valueOf()方法或者toString()方法来将自己转换成一个原始值,但symbol对象不会这么干,symbol对象无法隐式转换成对应的原始值。
var s = Symbol.for("s");
console.log(s.valueOf()); // Symbol(s)
Symbol.prototype[@@toPrimitive]
Symbol()[Symbol.toPrimitive](hint)
[@@toPrimitive]()方法可将Symbol对象转换为原始值,hint参数未被使用。
var s = Symbol.for("s");
console.log(s[Symbol.toPrimitive]()); // Symbol(s)
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://www.runoob.com/w3cnote/es6-symbol.html
https://developer.mozilla.org/zh-CN/docs/Glossary/Symbol
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
Js中Symbol对象的更多相关文章
- 深入理解JS中的对象(三):class 的工作原理
目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- js中XMLHttpRequest对象实现GET、POST异步传输
js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- js中推断对象详细类型
大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- JS中定义对象和集合
在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...
- Js中Map对象的使用
Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...
随机推荐
- 【SHELL】查找包含指定字符串的目录、在找出的路径中找出指定格式的文件、并统计出数量
查找包含字符串"skull"的目录.在找出的路径中找出格式".c/.cpp/.h"的文件.并统计出数量 find . -path ./out -prune -o ...
- [springmvc] - 配置文件 springmvc-config.xml 和 web.xml
springmvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- [转帖]Difference between localhost and 127.0.0.1?
https://www.tutorialspoint.com/difference-between-localhost-and-127-0-0-1#:~:text=The%20most%20signi ...
- 某环境私有云 rpm 包安装失败总结
1. 最近公司同事说一个项目搭建环境时 rpm 安装mysql数据库会报错 错误图片主要如下: 第一个错误提示是 提示 /etc/host.conf line 2: bad command `nosp ...
- 【一个小发现】VictoriaMetrics 中 vmselect 的 `-search.denyPartialResponse` 选项不应该开启
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 一直以为vmselect 的 -search.denyPa ...
- 情侣纪念日网站html5源码教程
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 预览图 直接进入我的网站吧 >> Z_ ...
- 从Spring源码看Spring如何解决循环引用的问题
Spring如何解决循环引用的问题 关于循环引用,首先说一个结论: Spring能够解决的情况为:两个对象都是单实例.且通过set方法进行注入. 两个对象都是单实例,通过构造方法进行注入,Spring ...
- 安装和定位vimrc
在上一篇文章中,我们简单开了一个头,阐述了下学习vim的必要性,这章开始,会慢慢由浅入深的学习它的一套完整的,高效的文本编辑方式方法.废话不多说,咱们正式开始吧 安装NeoVim 相对于vim来说,n ...
- 【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...
- 2.3 CE修改器:浮点数扫描
本关需要使用 Cheat Engine 工具对浮点数进行扫描,完成修改任务.浮点数是一种带有小数点的数值,通过"浮点数"扫描方式进行修改.本关中,健康值为单精度浮点数,弹药值为双精 ...