初步了解第六大基本类型Symbol

概述:

  什么是Symbol。Symbol是一个标记,一个独一无二的记号。

  Symbol的出现主要是解决了以前ES5中两个问题

  1. 在属性中同名的属性会被覆盖
  2. 无法做到属性的私有化

Symbol是什么:

  Symbol是符号的意思。实际上Symbol是一个内部的构造函数,每一次返回一个独一无二的符号。一种新的机制,可以保证属性名称的独一无二性。可以有效的避免属性的冲突,并且外部不能轻易拿到Symbol值属性。

  Symbol是是一种新的的原始数据类型。

Symbol的使用:

  Symbol没有字面量。Symbol的声明必须通过Symbol()来定义一个Symbol符号

定义一个Symbol:

Symbol()中可以传值也可以不传值。传值标识对这个符号的一个描述

左边是传入不同类型描述的返回结果(测试时间:2019/12/28)

本质上就是根据传入的类型调用了对应类型的toString方法

这里需要注意的是传入undefined输出的是空(应该是做了对undefined的特殊处理)

Symbol在对象中作为符号属性的使用

举个栗子:

通过这个栗子不难发现:

  1. 不能直接通过.的方式获取到test中的符号属性
  2. 符号属性不能枚举
  3. 可以通过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的更多相关文章

  1. 深入探讨 ECMAScript 规范第五版

    深入探讨 ECMAScript 规范第五版 随着 Web 应用开发的流行,JavaScript 越来越受到开发人员的重视.作为 ECMAScript 的变体,JavaScript 语言的很多语法特性都 ...

  2. ECMAScript规范解读this

    在<JavaScript深入之执行上下文栈>中讲到,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution conte ...

  3. ECMAScript 5中属性的特性值

    这是<JavaScript高级程序设计(第三版)>第六章相关内容的总结. ECMAScript中有两种属性:数据属性和访问器属性.每种属性都有四个特性值. 数据属性的四个特性值: [[Co ...

  4. ECMAScript 6中的let和const关键词

    ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的. 一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域 ...

  5. 软件设计之UML—UML中的六大关系

    一.UML中的六大关系 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation), ...

  6. ECMASCRIPT 6中字符串的新特性

    本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...

  7. ECMAScript 6中的数组操作方法

    本文介绍ECMAScript 6即将带给我们新的数组操作方法,以及在怎样在现有浏览器应用这些新的数组特性. Note: 我将使用交替使用构造器(constructor)和类(class)两个术语. 类 ...

  8. ECMAScript 5中新增的数组方法

    ECMAScript 5中定义了9个新的数组方法,用于遍历.映射.过滤.检测.简化和搜索数组. 在开始介绍之前,很有必要对这几个新增的数组方法做一个概述.首先,大多数方法的第一个参数接收一个函数,并且 ...

  9. 【react】利用prop-types第三方库对组件的props中的变量进行类型检测

    1.引言--JavaScript就是一个熊孩子   1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...

随机推荐

  1. js将已有数组重新分组(将数组每10项分成一组)

    项目中碰到的一个小需求:分页请求数据,一次请求60条,需要将后台返回的数组每10条分成一组渲染一个表格(表格使用的是ant-design-vue的table) 实现逻辑: var chunk = 10 ...

  2. Redis入门(介绍、搭建)——Windows、Centos环境

    一.介绍 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cac ...

  3. PMP--1.5 项目管理描述

    项目所处的环境将影响每个项目管理过程的实施方式以及项目制约因素的优先顺序. 一. 管理一个项目的过程 ​管理一个项目通常包括(但不限于): 1. 识别项目需求 2. 处理相关方的各种需要.关注和期望 ...

  4. ASP.NET Core DI概述

    众所周知,ASP.NET Core有一个DI框架,应用程序启动时初始化. 预定义依赖 1: IApplicationBuilder:提供了配置应用程序的请求管道机制 2:ILoggerFactory: ...

  5. 如何在CentOS上安装Tensorflow的gpu版本?

    系统配置 系统版本: Centos7.6 语言: Python3.5(anaconda3 4.2) 框架: Tensorflow 安装依赖 sudo yum install openjdk-8-jdk ...

  6. JAVA类变量、类方法

    类变量(static) 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. public class C { ...

  7. HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure

    问题: 原因:一般来说是由于.NET Core SDK的版本引起的,此时需要观察项目的所需的版本和本地存在的板本是否一致. 本例中,项目所需的版本是2.2如下图所示 本地存在的版本如下图所示,是不存在 ...

  8. GHO文件安装到Vmware的两种姿势

    1.使用 Ghost11.5.1.2269 将gho转换为vmdk文件(虚拟机硬盘),Vmware新建虚拟机自定义配置,然后添加已有的虚拟硬盘文件. 注意ghost的版本,如果你是用Ghost11.5 ...

  9. CGI、FastCGI和php-fpm的概念和区别和运行原理

    CGI: CGI的英文是(COMMON GATEWAY INTERFACE)公共网关接口,它的作用就是帮助服务器与语言通信,这里就是nginx和php进行通信,因为nginx和php的语言不通,因此需 ...

  10. 使用INF创建CSR文件

    公司要为一个英国的客户提供由HTTP升级到HTTPS的服务,于是接触到了申请SSL证书这方面的内容. 一.总的来说,申请证书需要两步,一是创建CSR文件,二是在证书提供商购买证书并将CSR文件发给证书 ...