初步了解第六大基本类型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. 非对称加密 秘钥登录 https

    非对称加密简介: 对称加密算法在加密和解密时使用的是同一个秘钥:而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)私有密钥(private key,简 ...

  2. [Python]公司接口返回值规范

    返回值规范 json { "code":200, "message":"" "data":[ { "title ...

  3. HDU 1042 大数阶乘

    B - 2 Time Limit:5000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  4. 杭电1007-----C语言实现

    这道题花了好久的时间才做出来,刚开始没有思路,最后看了网上的解答,好难得样子,每次都没有看完,但是掌握了大概思想,今天试着做了一下,已ac 主要思想:先将点对按照x排序,再在x排好序的基础上按照y来排 ...

  5. .net core 3 web api jwt 一直 401

    最近在给客户开发 Azure DevOps Exension, 该扩展中某个功能需要调用使用 .NET Core 3 写的 Web Api. 在拜读了 Authenticating requests ...

  6. mysql实现远程登录

    CentOS7上安装mysql后,想要实现mysql远程登录. 主要解决二个问题:(1)为mysql用户授予远程登录权限(改表法或授权法):(2)防火墙开放3306端口. (一)授予登录权限 mysq ...

  7. MFC/QT 学习笔记(三)——MFC模板创建

    新建项目->MFC模板->MFC应用程序->应用程序类型:单个文档:项目样式:MFC 标准->下一步...OK 此时点击运行,可直接弹出窗口. 调整 视图->类视图: · ...

  8. CSGO控制台命令

    转帖: 按下“~”即可开启 使用时先输入参数名 然后按下SPACE空出一格 再输入设定值即可 一般玩家进入游戏都只能用到Client(玩家用参数) 不过...如果你是开LAN GAME的人 就能进阶到 ...

  9. Python模块之Requests

    目录 Requests 模块 常规的get请求 基于ajax的get请求 常规的post请求 基于ajax的post请求 综合项目实战 requests模块高级 requests代理 验证码处理 Re ...

  10. Kubernetes 部署 Nebula 图数据库集群

    Kubernetes 是什么 Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应 ...