Symbol

书中讲了2部分。

  1. Symbol()
  2. Symbol 属性值.

完全两种画风的东西.

1. Symbol

首先他是一种全新的值. 不属于以前的任何一种

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)

他是一种不会重复的值.

  1. h.w(' Basic ');
  2. h.w('line');
  3. var a = Symbol();
  4. var b = Symbol();
  5. h.w(a == b); //false
  6. var c = Symbol('c');
  7. var d = Symbol('c');
  8. h.w(c == d); //false

后面那个参数对于值,并没有什么卵用。

它始终会生成不一样的值。

是对于 Symbol 的一种描述。 你总的知道他是做什么的把.

它就是一种不回重复的标识。

所以他不可以用于 计算,字符串拼接等等.

如果转换为 boolean 始终为 true

  1. var a = Symbol();
  2. if(a)
  3. h.w(true); //true
  4. Boolean(a) //true

有时候会想使用相同的值。

  1. var e = Symbol('foo');
  2. var f = Symbol.for('foo');
  3. var g = Symbol.for('foo');
  4. h.w(e == f); //false
  5. h.w(g == f); //true

就用for。 他会寻找之前是有已经有了。 如果有了就返回一样的。

  1. h.w(Symbol.keyFor(f)); //foo
  2. h.w(Symbol.keyFor(e)); //undefined

keyFor就是返回 已经标记过的描述

它是唯一不会重复的。

第一感觉就是用于常量。

  1. var dataConfig = 'xxx'

然后经常被人直接

  1. function a(key)
  2. {
  3. if(key == 'xxx') {}
  4. }

有了这个之后,必须给我找到常量。

还有就是可以免去命名的烦恼。

书中讲了属性遍历。

  1. var obj = {};
  2. var a = Symbol('a');
  3. var b = Symbol('b');
  4. obj[a] = 'Hello';
  5. obj[b] = 'World';
  6. var objectSymbols = Object.getOwnPropertySymbols(obj);
  7. h.w(obj[objectSymbols[0]]); //Hello
  8. h.w(obj[objectSymbols[1]]); //World
  9. h.w(objectSymbols[0] === a) //true

这样就可以查找到 Symbol

你通过其他方式是不行的。

  1. for(var key in obj)
  2. {
  3. h.w(key);
  4. }

直接跳过了 Symbol 参数.

书中说可以用他来实现一些特殊的功能..

不过我并没有看出他的特别,用其他方式的也能实现啊。

或许等我 理解更深入一点儿就能明白。

  1. var size = Symbol('size');
  2. class Collection {
  3. constructor() {
  4. this[size] = 0;
  5. }
  6. add(item) {
  7. this[this[size]] = item;
  8. this[size]++;
  9. }
  10. static sizeOf(instance) {
  11. return instance[size];
  12. }
  13. }
  14. var x = new Collection();
  15. Collection.sizeOf(x) // 0
  16. x.add('foo');
  17. Collection.sizeOf(x) // 1
  18. Object.keys(x) // ['0']
  19. Object.getOwnPropertyNames(x) // ['0']
  20. Object.getOwnPropertySymbols(x) // [Symbol(size)]

2. Symbol 属性

Symbol的属性和 Symbol完全就是两个画风.

感觉一点儿联系都没有..

比如

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

原本不支持 instanceof.

你用了这个以后就支持了.

  1. Symbol.hasInstance (重载 instanceof. )
  2. Symbol.isConcatSpreadable (arr.concat 是否展开.)
  3. Symbol.species
  4. Symbol.match
  5. Symbol.replace
  6. Symbol.search
  7. Symbol.split
  8. Symbol.iterator (写一个方法支持默认的 for of 循环)
  9. Symbol.toPrimitive (当该对象被转为原始类型的值,触发)
  10. Symbol.toStringTag
  11. Symbol.unscopables

10 Symbol的更多相关文章

  1. ES6入门九:Symbol元编程

    JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有und ...

  2. ECMAScript 6 扫盲

    ECMAScript 6 目前基本成为业界标准,它的普及速度比 ES5 要快很多,主要原因是现代浏览器对 ES6 的支持相当迅速,尤其是 Chrome 和 Firefox 浏览器,已经支持 ES6 中 ...

  3. ES6入门笔记

    ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...

  4. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  5. 【WEB前端】使用百度ECharts,绘制项目质量报表

    一.下载ECharts的js库 下载地址:http://echarts.baidu.com/download.html 由于我们对体积无要求,所以我们采用了完整版本,功能齐全,在项目中,我们只需要像普 ...

  6. ArcGIS API for Silverlight代码中使用Template模板

    原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...

  7. ES6 扫盲

    原文地址:ECMAScript 6 扫盲--小胡子 1. let.const 和 block 作用域 let 允许创建块级作用域,ES6 推荐在函数中使用 let 定义变量,而非 var: var a ...

  8. es6的新内容

    前端学习总结(十八)ES6--新一代的javascript 发表于2016/6/11 21:44:27  2733人阅读 分类: javascript 简介 ECMAScript 6(以下简称ES6) ...

  9. 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例

    使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发 ...

随机推荐

  1. AngularJS下对数组的比较

    Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false <script type="text/javascri ...

  2. SYN Flood测试

    由于工作需要对公司进行SYN Flood测试,在网上查了些资料,Youtube上找到最多的方法就是hping3工具来实现, 该工具已经预装在Kali下,具体操作用一条命令即可实现. hping3 -S ...

  3. 我厂 WiFi SDK 开源了, 直接开源 WiFi 万能钥匙核心功能,造福中小开发者

    官方地址: http://global.18wifibank.com/ github: https://github.com/yibawifi/wifisdk

  4. RecyclerView 的介绍以及多布局的实例

    RecyclerView 的使用以及多布局的实例 RecyclerView 是在Android5.0之后推出的,是一个比ListView更加灵活更加高效的适配器类型控件.但是RecyclerView不 ...

  5. SqlServer表结构查询

    一.前言 近两天项目升级数据迁移,将老版本(sqlserver)的数据迁移到新版本(mysql)数据库,需要整理一个Excel表格出来,映射两个库之间的表格字段,示例如下: Mysql数据库查询表结构 ...

  6. 字符串匹配算法--Brute-Force算法

    Brute-Force(暴力)算法是字符串匹配中最简单也是最容易理解的算法. 主要思想是 按顺序遍历母串,将每个字符作为匹配的起始字符,判断是否匹配字串.若第一个字符与字串匹配,则比较下一个字符,否则 ...

  7. There is no getter for property named 'useName' in 'class cn.itcast.mybatis.pojo.User'

    org.apache.ibatis.exceptions.PersistenceException: ### Error updating database.  Cause: org.apache.i ...

  8. 平常看到的Alt+xx 快捷键用法

    1. 先按Alt, 哪一个菜单对应的字符是有划线的. 2. 输入对应的字符打开相应的菜单, 3 再输入相应的字符打开子菜单

  9. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  10. MVC+EF6+Oracle,提示ORA-01918: user '***' does not exist

    1.在上下文里重载OnModelCreating:        //没用到这个方法         protected override void OnModelCreating(DbModelBu ...