前言

Symbol 是 es6 的特性. 如果只是写业务逻辑代码, 其实是不太会用到的. 如果是做架构, 封装, UI 组件才有需要.

但学它的概念是好的. es6 有需要内置的 Symbol 链接者许多常用的功能, 如果想修改这些 build-in 的东西, 了解 Symbol 是必须的.

参考

阮一峰 – Symbol

没有钱买阮老师的书支持, 在这里帮忙推荐一下, 想学 JavaScript 新手, 或新手进阶都很适合读.

Unique String

调用 Symbol 方法, 传入一个 name 或者叫 description 就会返回一个 Symbol (不需要 new 哦)

const mySymbol1 = Symbol('name');
const mySymbol2 = Symbol('name');
console.log(mySymbol1 === mySymbol2); // false

Symbol 的特色是它即使用同一个 name 创建出来, 但 Symbol 却是不同的.

有时候写代码时, 我们会用一些特别字符串 (hardcode) 做判断. 这样不太好, 因为不可以 rename 全场换. 把它装入到 Symbol 就剪掉了这种耦合关系.

Symbol Description

const mySymbol1 = Symbol('name');
console.log(mySymbol1.description === 'name'); // true

通过 description 可以拿回初始化时传入的 name

Symbol in Object

其实这个才是重点. Symbol 可以作为 object 的 key.

const mySymbol1 = Symbol('name');
const obj = {
name: 'Derrick',
[mySymbol1]: 'value',
};
console.log(obj[mySymbol1] === 'value'); // value
console.log(Object.keys(obj)); // ['name']
console.log(Object.getOwnPropertySymbols(obj)); // [mySymbol1]
console.log(Reflect.ownKeys(obj)); // ['name', mySymbol1]

注意, 获取 symbol key 的方式, 我们常用的 Object.keys 是遍历不到 Symbol 的.

为什么说这个才是重点呢? 因为 es6 用了许多 build-in 的 Symbol 在各种 object 上.

实现了许多方法. 比如最有名的 Symbol.iterator. 总共有 11 种 build-in Symbol.

从这里就可以明白, 为什么 Symbol 是 unique 的, 因为它需要放到 object key 里头, 用 string 会撞名字.

此外因为有这些 build-in Symbol, 所以 Object.keys 默认遍历不出来.

Symbol 的 best practice 就是像那么 build-in 的 Symbol 那样使用. 下面介绍几个比较火的.

Build-in Symbol

Symbol.hasInstance

class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
} [1, 2, 3] instanceof new MyClass() // true

看明白了吗, instanceof 其实是调用了对象里面 Symbol.hasInstance 的方法.

Symbol.Split

const array = 'abc'.split({
[Symbol.split](value) {
console.log(value === 'abc'); // true
return ['a', 'b', 'c'];
},
}); console.log(array); // ['a', 'b', 'c']

string 的 split 方法, 参数 seperator 除了可以是 string | Regex 以外还可以是一个带有 Symbol.split 的对象.

Symbol.iterator

任何对象, 一旦有了 Symbol.iterator 就变成了迭代器. 可以被 for of 遍历.

const myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
}; [...myIterable] // [1, 2, 3]

Symbol.toPrimitive

控制当对象被类型转换时的逻辑

let obj = {
[Symbol.toPrimitive](hint) {
switch (hint) {
case 'number':
return 123;
case 'string':
return 'str';
case 'default':
return 'default';
default:
throw new Error();
}
}
}; 2 * obj // 246
3 + obj // '3default'
obj == 'default' // true
String(obj) // 'str'

hint = number 意思是, 对象要被转去 number 了, 这时就应该返回一个数字.

default 的意思是可能是转成 number, 也可能是 string. (这个比较难理解)

据这个例子主要是让你体会一下 Symbol 搭配 object 和各种操作场景下, 它是如果运作的.

总结

Symbol 主要的玩法就像诸多 build-in Symbol 那样. 操作语法 + 对象 Symbol = resul

JavaScript – Symbol的更多相关文章

  1. JavaScript Symbol对象

    JavaScript Symbol对象 Symbol Symbol对象是es6中新引进的一种数据类型,它的作用非常简单,就是用于防止属性名冲突而产生. Symbol的最大特点就是值是具有唯一性,这代表 ...

  2. Javascript Symbol 隐匿的未来之星

    ES6中基础类型增加到了7种,比上一个版本多了一个Symbol,貌似出现了很长时间,但却因没有使用场景,一直当作一个概念层来理解它,我想,用它的最好的方式,还是要主动的去深入了解它吧,所以我从基础部分 ...

  3. JavaScript Symbol

    创建: 2019/02/26 完成: 2019/02/26  生成  每次生成的值都不一样(===, ==都是) var sym = Symbol(); // 可以有参数, 是对symbol的说明 v ...

  4. 【翻译】MongoDB指南/引言

    [原文地址]https://docs.mongodb.com/manual/ 引言 MongoDB是一种开源文档型数据库,它具有高性能,高可用性,自动扩展性 1.文档数据库 MongoDB用一个文档来 ...

  5. MongoDB学习笔记-数据格式及数据类型

    JSON JSON是一种简单的数据表示方式,它易于理解.易于解析.易于记忆.但从另一方面来说,因为只有null.布尔.数字.字符串.数组和对象这几种数据类型,所以JSON有一定局限性.例如,JSON没 ...

  6. MongoDB - Introduction to MongoDB, BSON Types

    BSON is a binary serialization format used to store documents and make remote procedure calls in Mon ...

  7. Windows下安装配置MongoDB

    Windows下安装配置MongoDB 一,介绍 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB ...

  8. mongoDB 文档概念

    mongoDB 文档概念 什么是文档 文档是 mongodb 基本的数据组织单元,类似于mysql 中的记录 文档由多个键值对组成,每个键值对表达一个数据项 属于 bson 数据 ps:  bson ...

  9. MongoDB的数据类型介绍

    参考MongoDB官网:https://docs.mongodb.com/manual/reference/bson-types/ MongoDB文档存储是使用BSON类型,BSON(BSON sho ...

  10. 使用mongo shell转换字符类型

    MongoDB数据类型如下: 类型 对应数字 别名 说明 Double1 1 double   String 2 string   Object 3 object   Array 4 array   ...

随机推荐

  1. 拯救SQL Server数据库事务日志文件损坏的终极大招

    拯救SQL Server数据库事务日志文件损坏的终极大招 在数据库的日常管理中,我们不可避免的会遇到服务器突然断电(没有进行电源冗余),服务器故障或者 SQL Server 服务突然停掉, 头大的是l ...

  2. 基于django(爱抚宠物) 小程序设计和实现(源码+LW+部署讲解)

    感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用 ...

  3. Day 7 - 哈希与 KMP

    字符串哈希 定义 我们定义一个把字符串映射到整数的函数 \(f\),这个 \(f\) 称为是 \(\text{Hash}\) 函数. 我们希望这个函数 \(f\) 可以方便地帮我们判断两个字符串是否相 ...

  4. Sonar 扫描之SonarScanner介绍

    Sonar扫描之SonarScanner介绍 SonarScanner用于在构建系统没有指定scanner时使用. 项目配置 在你的项目根目录中创建一个名为 sonar-project.propert ...

  5. electron安装成功记录

    1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...

  6. Microsoft Dynamics CRM 插件被限制2分钟超时解决方案

    背景: 在隔离模式"沙箱"中运行的插件或自定义工作流活动将有2分钟的硬限制.如果你的插件很复杂,需要超过2分钟,有一些解决方法. CRM on premise (本地版) 选择插件 ...

  7. Jmeter二次开发函数 - 文本替换

    此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...

  8. Jmeter函数助手2-Random

    Random函数用于获取随机范围内的正整数或负整数. 一个范围内的最小值:必填,且必须填入整数(正负数都可以) 一个范围内允许的最大值:必填,且必须填入整数(正负数都可以).最大值需大于最小值如[-6 ...

  9. Netty的源码分析和业务场景

    Netty 是一个高性能.异步事件驱动的网络应用框架,它基于 Java NIO 构建,广泛应用于互联网.大数据.游戏开发.通信行业等多个领域.以下是对 Netty 的源码分析.业务场景的详细介绍: 源 ...

  10. 【JavaWeb】HttpClient

    需要的依赖: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <de ...