Symbol

书中讲了2部分。

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

完全两种画风的东西.

1. Symbol

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

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

他是一种不会重复的值.

h.w(' Basic ');
h.w('line');
var a = Symbol();
var b = Symbol();
h.w(a == b); //false
var c = Symbol('c');
var d = Symbol('c');
h.w(c == d); //false

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

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

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

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

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

如果转换为 boolean 始终为 true

var a = Symbol();

if(a)
    h.w(true); //true

Boolean(a) //true

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

var e = Symbol('foo');
var f = Symbol.for('foo');
var g = Symbol.for('foo');
h.w(e == f); //false
h.w(g == f); //true

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

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

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

它是唯一不会重复的。

第一感觉就是用于常量。

var dataConfig = 'xxx'

然后经常被人直接

function a(key)
{
    if(key == 'xxx') {}
}

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

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

书中讲了属性遍历。

var obj = {};
var a = Symbol('a');
var b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

var objectSymbols = Object.getOwnPropertySymbols(obj);

h.w(obj[objectSymbols[0]]); //Hello

h.w(obj[objectSymbols[1]]); //World

h.w(objectSymbols[0] === a) //true

这样就可以查找到 Symbol

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

for(var key in obj)
{
    h.w(key);
}

直接跳过了 Symbol 参数.

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

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

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

var size = Symbol('size');

class Collection {
  constructor() {
    this[size] = 0;
  }

  add(item) {
    this[this[size]] = item;
    this[size]++;
  }

  static sizeOf(instance) {
    return instance[size];
  }
}

var x = new Collection();
Collection.sizeOf(x) // 0

x.add('foo');
Collection.sizeOf(x) // 1

Object.keys(x) // ['0']
Object.getOwnPropertyNames(x) // ['0']
Object.getOwnPropertySymbols(x) // [Symbol(size)]

2. Symbol 属性

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

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

比如

class MyClass {
  [Symbol.hasInstance](foo) {
    return foo instanceof Array;
  }
}

[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. SalesForce 记录级别安全性

    对象级安全性 简档 对象级安全性提供了控制 Salesforce.com 中数据的最简单方式.使用对象级安全性 您可以防止用户查看.创 建.编辑或删除特殊类型对象的任何实例 如潜在客户或业务机会.对象 ...

  2. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  3. 用lumen构建API的相关流程

    概述 Lumen是一个基于Laravel的微框架,主要用于小型应用和微服务,专注于性能和速度的优化,该框架一个重要的应用就是构建 RESTAPI. 为什么用Lumen构建REST API Lumen访 ...

  4. 机器学习实战笔记(Python实现)-04-Logistic回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  5. Yii 开发微信 '您提交的数据无法被验证'

    使用Yii开发微信时,出现 [error][yii\web\HttpException:] exception 'yii\web\BadRequestHttpException' with messa ...

  6. 项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程

    之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估 ...

  7. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  8. 让div盒子相对父盒子垂直居中的几种方法

    div相对于父盒子垂直居中的几种方法,之前在网上看到很多种方法,确实说的很对,也很具体,但是我感觉对于初学者来说,一目了然是最重要的,所以,我把很高深的技巧,和很复杂的css样式都剔除掉,旨在让更多人 ...

  9. Java中接口和抽象类的区别

    经常看到这样的问题,就是问这两个的区别,我这也总结一下: 1,宏观上说,一个是类,一个是接口,类只支持单一继承,接口支持多个继承 2,微观上说,就是从内部来说 a,成员变量方面 接口可以包含方法,属性 ...

  10. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...