前言

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. 毕业设计&毕业项目:基于springboot+jsp实现的健身房管理系统

    一.前言 在当今数字化时代,音乐已经成为人们生活中不可或缺的一部分.随着技术的飞速发展,构建一个用户友好.功能丰富的在线音乐平台成为了许多开发者和创业者的目标.本文将介绍如何使用SpringBoot作 ...

  2. 关于构建一个可视化+code系统的思路

    思路是有参考UE的现有功能,加之前的逻辑. 大概分为三个模块: 底层, 即native层 ,这一层实际上分为三个部分:  1.GUI层的解析,2.数据存储   3.Code的解析 这三部分关键在于他们 ...

  3. VUE系列---深度解析 Vue 优化策略

    在前端开发中,性能优化一直是一个重要的课题.Vue.js 提供了多种优化策略,帮助开发者构建高性能的应用.本文将深入解析以下几个优化策略: 使用 v-once.v-if 和 v-show 的区别和优化 ...

  4. Java8 Stream流使用

    Java8 Stream 流式编程 一.Lambda表达式 Lambda表达式也可以称为闭包,它是推动Java8发布的最重要新特性,lambda允许把函数作为一个方法参数传递给方法. 在Java8之前 ...

  5. Jenkins+docker 部署SpringCloud微服务

    部署需要提前准备的环境:安装好Jenkins.docker.Maven.Jdk1.8.Git 说明:由于本例只说明如何部署,所以有关项目其他服务如nacos.mysql.redis.seata等默认已 ...

  6. docker cmd和entrypoint

    FROM scratch 很多镜像都是从他开始 创建自己的centos FROM centos 基于官方的centos开始写 构建自己的centos [root@docker dockerfile]# ...

  7. 我用Awesome-Graphs看论文:解读Naiad

    Naiad论文:<Naiad: A Timely Dataflow System> 前面通过文章<论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样>向大家 ...

  8. 2、SpringMVC之入门案例

    2.1.环境搭建 2.1.1.右击project创建新module 2.1.2.选择maven 2.1.3.设置module名称和路径 2.1.4.module初始状态 2.1.5.配置打包方式 注意 ...

  9. 【Hibernate】05 缓存与MySQL事务隔离

    Cache 什么是缓存? 数据存储到数据库,是从内存中以流的方式写进[输出]到数据库,其效率并不是很高 - 所以在内存中暂存一部分数据,可以不以流的方式读取,效率是非常高的[相对于流来说] Hiber ...

  10. python高性能计算:cython使用openmp并行 —— 报错:undefined symbol: omp_get_thread_num

    test.pyx文件: from cython.parallel cimport parallel from openmp cimport omp_get_thread_num cpdef void ...