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,则返回该symbolkey值,返回值为字符串类型,否则返回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对象的更多相关文章

  1. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  2. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  3. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  4. js中XMLHttpRequest对象实现GET、POST异步传输

    js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...

  5. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  6. js中推断对象详细类型

    大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...

  7. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  8. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  9. JS中定义对象和集合

    在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...

  10. Js中Map对象的使用

    Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...

随机推荐

  1. 【RTOS】基于RTOS的嵌入式系统看门狗策略

    RTOS - high integrity systems 看门狗策略 Watchdog Strategies for RTOS enabled embedded systems 介绍 看门狗定时器就 ...

  2. crypto常用工具

    古典密码 维吉尼亚密码(Vigenere): https://github.com/atomcated/Vigenere(加密解密程序,包含自动猜测密钥功能) https://www.guballa. ...

  3. html监听标签的resize

    <html> <body> <div id="div1" style="width:100%;height:100%;"> ...

  4. [转帖]修改Linux内核参数,减少TCP连接中的TIME-WAIT

    https://www.cnblogs.com/xiaoleiel/p/8340346.html 一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作.要提高Lin ...

  5. [转帖]linux 下 {}大括号的用法

    我们平时使用Linux的时候经常遇到这样一个问题,举例有这样一种情况:执行命令 $ cp /etc/apt/sources.list /etc/apt/sources.list.bak 这里面有个问题 ...

  6. DBeaver连接国产信创数据库的步骤

    DBeaver连接国产信创数据库的步骤 本次连接使用的数据库类型 1.达梦 2.神通 3.人大金仓 4.瀚高 安装DBeaver 通过官网或者是其他网站下载最新的数据库介质 之后的操作为: 这次不感谢 ...

  7. 【K哥爬虫普法】一个人、一年半、挣了2000万!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  8. arch linux 安装

    好长时间都没有更新自己的博客了,我简单翻阅了一下自己的更新记录,上一次更新好像还是在5月份左右,距今也有快半年,这半年也是遇到了很多事情,有不好的,也有好的.这半年我对在日常生活工作中使用Linux系 ...

  9. 深度学习应用篇-自然语言处理[10]:N-Gram、SimCSE介绍,更多技术:数据增强、智能标注、多分类算法、文本信息抽取、多模态信息抽取、模型压缩算法等

    深度学习应用篇-自然语言处理[10]:N-Gram.SimCSE介绍,更多技术:数据增强.智能标注.多分类算法.文本信息抽取.多模态信息抽取.模型压缩算法等 1.N-Gram N-Gram是一种基于统 ...

  10. 机器学习算法(四): 基于支持向量机的分类预测(SVM)

    机器学习算法(四): 基于支持向量机的分类预测 本项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc 1.相关流程 支 ...