ECMAScript规范中第六大基本类型 Symbol
初步了解第六大基本类型Symbol
概述:
什么是Symbol。Symbol是一个标记,一个独一无二的记号。
Symbol的出现主要是解决了以前ES5中两个问题
- 在属性中同名的属性会被覆盖
- 无法做到属性的私有化
Symbol是什么:
Symbol是符号的意思。实际上Symbol是一个内部的构造函数,每一次返回一个独一无二的符号。一种新的机制,可以保证属性名称的独一无二性。可以有效的避免属性的冲突,并且外部不能轻易拿到Symbol值属性。
Symbol是是一种新的的原始数据类型。
Symbol的使用:
Symbol没有字面量。Symbol的声明必须通过Symbol()来定义一个Symbol符号
定义一个Symbol:

Symbol()中可以传值也可以不传值。传值标识对这个符号的一个描述
左边是传入不同类型描述的返回结果(测试时间:2019/12/28)
本质上就是根据传入的类型调用了对应类型的toString方法
这里需要注意的是传入undefined输出的是空(应该是做了对undefined的特殊处理)
Symbol在对象中作为符号属性的使用
举个栗子:


通过这个栗子不难发现:
- 不能直接通过.的方式获取到test中的符号属性
- 符号属性不能枚举
- 可以通过Object.getOwnPropertyDescriptors的方法获取到完整的test对象,但是依然不能取符号属性
作为开发人员,如果说非要拿到符号属性,可以通过Object.getOwnPropertySymbols()的方法获取到符号属性


在开发中为了私有化属性可以用到Symbol符号来私有化属性。但是频繁的用Object.getOwnPropertySymbols太过于繁琐。为了解决这个问题于是有了Symbol.for()
Symbol.for()共享符号
举例栗子:


在编码阶段可轻松的拿到obj内的符号属性
Symbol.keyfor()获取一个已登记符号的描述
已登记符号就是Symbol.for声明的符号


没有用Symbol.for登记的符号为undefined
无名的共享符号也为undefined
知名符号
ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。
以下是现有知名符号的举例:
Symbol.hasInstance:当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
Symbol.isConcatSpreadable:表示该对象用于Array.prototype.concat()时,是否可以展开。
Symbol.species:对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性。
Symbol.match:对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值
Symbol.replace:对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。
Symbol.search:对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。
Symbol:对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值。
重要
Symbol.iterator:对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
Symbol.toPrimitive:对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol.toStringTag:对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用Object.prototype.toString方法时,如果这个属性存在,它的返回值会出现在toString方法返回的字符串之中,表示对象的类型。也就是说,这个属性可以用来定制[object Object]或[object Array]中object后面的那个字符串。
可以改写构造函数的内置类型,如果构造函数中定义了这个值用这个值最后的返回值(字符串)作为他的类型,没有则用默认类型
例子:


Symbol.unscopables:对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。
ECMAScript规范中第六大基本类型 Symbol的更多相关文章
- 深入探讨 ECMAScript 规范第五版
深入探讨 ECMAScript 规范第五版 随着 Web 应用开发的流行,JavaScript 越来越受到开发人员的重视.作为 ECMAScript 的变体,JavaScript 语言的很多语法特性都 ...
- ECMAScript规范解读this
在<JavaScript深入之执行上下文栈>中讲到,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution conte ...
- ECMAScript 5中属性的特性值
这是<JavaScript高级程序设计(第三版)>第六章相关内容的总结. ECMAScript中有两种属性:数据属性和访问器属性.每种属性都有四个特性值. 数据属性的四个特性值: [[Co ...
- ECMAScript 6中的let和const关键词
ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的. 一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域 ...
- 软件设计之UML—UML中的六大关系
一.UML中的六大关系 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation), ...
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...
- ECMAScript 6中的数组操作方法
本文介绍ECMAScript 6即将带给我们新的数组操作方法,以及在怎样在现有浏览器应用这些新的数组特性. Note: 我将使用交替使用构造器(constructor)和类(class)两个术语. 类 ...
- ECMAScript 5中新增的数组方法
ECMAScript 5中定义了9个新的数组方法,用于遍历.映射.过滤.检测.简化和搜索数组. 在开始介绍之前,很有必要对这几个新增的数组方法做一个概述.首先,大多数方法的第一个参数接收一个函数,并且 ...
- 【react】利用prop-types第三方库对组件的props中的变量进行类型检测
1.引言--JavaScript就是一个熊孩子 1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...
随机推荐
- 01 web api接口
WEB API接口 接口介绍 接口概念:前台与后台进行信息交互的媒介 - url连接 https://api.map.baidu.com/place/v2/search 接口组成: url链接 - 长 ...
- JS用map做接口数据映射
· 接口做数据映射的好处:前端页面自定义的字段不需要和后端字段相同,后端修改字段前端不受影响. · 从接口得到数据 res: let r = res.map(item => { return { ...
- javascript中onclick(this)用法介绍
this指触发事件的对象 代码如下: <input id="myinput" type="text" value="javascript中onc ...
- redis_入门
Redis_day01 1. NoSql 1.1 NoSql是什么 NoSQL(不仅仅是SQL not only SQL),泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在处 ...
- 全国省市,4个直辖市geoCoord数据,用于echart gl 3d地图
var geoCoordMap = { '北京': [116.4551, 40.2539], '东城区':[116.418757,39.917544], '西城区':[116.366794,39.91 ...
- 2019-2020-2 20175121杨波《网络对抗技术》第一周kali的安装
2019-2020-2 20175121杨波<网络对抗技术>第一周kali的安装 标签 : Linux 一.下载安装kali 1.下载kali 下载链接 打开链接进入官网后,点击Torre ...
- 0x01 C语言-编写第一个hello world
学习每一个编程语言都是从 "Hello world!" 开始的,这好像就是编程界一条不成文的规定一样. 在这篇文章中,我将教大家编写一个可以输出 "Hello world ...
- Ubuntu-Server18.04开启无线网卡并配置静态ip
手里有一个笔记本快10年了,还是奔腾处理器,最近把它做成了Ubuntu-Server的系统,花了点时间折腾无线网卡,稍微记录一下,希望看见的人能少踩点坑. 1. 制作U盘启动工具,从Ubuntu官网下 ...
- Angularjs集成于ASP.NET MVC数据绑定重构
这几天,对程序重构,主要针对angularjs的绑定: 第一个例子: 下面是一段html程序: 不管是name或者是ng-model的属性值,它都有一定规律"StartX"和&qu ...
- TensorFlow安装-(Ubuntu18.04.3 & Anaconda3)
1.背景 使用ubuntu18.04.3安装Anaconda3之后使用网上教程安装tensorflow失败,踩了多个坑,特此总结经验 附官方教程:https://tensorflow.google.c ...