ES5对象属性名都是字符串容易造成属性名的冲突。

eg:var a = { name: 'lucy'};a.name = 'lili';这样就会重写属性

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。

重新复习下新知识:基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

这里新添加了一种:Symbol

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();s1 === s2 // false// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");s1 === s2 // false

Symbol值不能与其他类型的值进行运算

作为属性名的Symbol

var mySymbol = Symbol();// 第一种写法
var a = {};
a[mySymbol] = 'Hello!';// 第二种写法
var a = {[mySymbol]: 'Hello!'
};// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

注意,Symbol值作为对象属性名时,不能用点运算符。

var a = {};
var name = Symbol();
a.name = 'lili';
a[name] = 'lucy';
console.log(a.name,a[name]);             //lili,lucy

Symbol值作为属性名时,该属性还是公开属性,不是私有属性。

这个有点类似于java中的protected属性(protected和private的区别:在类的外部都是不可以访问的,在类内的子类可以继承protected不可以继承private)

但是这里的Symbol在类外部也是可以访问的,只是不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()返回。但有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名

Symbol.for(),Symbol.keyFor()

Symbol.for机制有点类似于单例模式,首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了。

var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');s1 === s2 // true

Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已创建

var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

转载于:https://www.cnblogs.com/ecmasea/p/8985806.html

ES6入门之Symbol相关推荐

  1. es6入门6--数组拓展运算符,Array.from()基本用法

    本文只是作为ES6入门第九章学习笔记,在整理知识点的同时,会加入部分个人思考与解答,若想知道更详细的介绍,还请阅读阮一峰大神的ES6入门 一.拓展运算符 ES6中新增了拓展运算(...)三个点,它的作 ...

  2. ES6入门之对象的扩展

    1. 属性的简洁表示法 在ES6中 允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁. const f = 'a' const b = {f} b // {f: 'a'}等同于 c ...

  3. ES6 入门教程 9 数组的扩展 9.1 扩展运算符

    ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 ES6 入门教程 9 数组的扩展 9.1 扩展运算符 9.1.1 含义 9.1 ...

  4. es6入门到五连绝世之三杀(triple kill )

    es6入门到五连绝世之三杀(triple kill ) 欢迎来到e6语法笔记教学 一.Promise 简介 1.1.Promise 异步执行顺序 1.2.自定义 promise 1.3.自定义Prom ...

  5. es6入门到五连绝世之四杀(quadra kill )

    es6入门到五连绝世之四杀(quadra kill ) 欢迎来到e6语法笔记教学 一.symbol 数据类型 1.1.介绍及使用 欢迎来到e6语法笔记教学 这篇博客的记录手法,是通过 demo 记录 ...

  6. ES6入门笔记(一)

    ES6入门笔记(一) 安装babel 由于浏览器对ES6的支持还不是很好,编写ES6代码前我们要安装一个babel工具将ES6代码编译成ES5代码,用如下命令安装babel: npm install ...

  7. ES6 中的 Symbol 是什么?

    前言 记得刚找工作那会,几种数据类型是必问题,当时的答案一般都是七种--字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null). ...

  8. ES6入门学习资源共享

    以下是收集的一些ES6学习资源,希望能帮助大伙: 学习ES6新特性: http://www.cnblogs.com/ziyunfei/ exploring-es6 https://leanpub.co ...

  9. es6入门到五连绝世之一血(first blood)

    es6入门到五连绝世之一血(first blood) 欢迎来到e6语法笔记教学 一.变量声明 1.1.变量声明有三种方式 1.2.JS中的块级作用域,var.let.const 三者的区别 1.2.1 ...

最新文章

  1. 网页制作的中的一些工具代码
  2. CentOS安装libpcap
  3. spark shell的运行模式汇总
  4. python绘制散点图的函数_python matplotlib更新函数的散点图
  5. C语言(CED)编写程序,求sum=1*1*1+2*2*2+3*3*3+4*4*4+5*5*5+····+n*n*n
  6. 整理综合布线系统中材料用量的计算公式
  7. pku 1149 PIGS(最大流)
  8. 修改Hosts不生效的解决办法
  9. Linux架设DNS服务器(ChinaITLab.com 搜集整理)
  10. 齐鲁工业大学计算机学院复试名单,齐鲁工业大学2019年硕士研究生拟录取名单公示...
  11. C++中带.h与不带.h的头文件
  12. 编程需要那些数学和计算机知识点,学习编程需要哪些基础?
  13. Unity 3分钟,将你的Terrin 地形转为FBX
  14. 【paper吐槽】【SelfSupervised Learning】Self-Supervised Image Restoration with Blurry and Noisy Pairs
  15. Missionaries from the global south try to save the godless West
  16. 电子病历模板编辑器_这几个邮件模板网站,帮助提升工作效率
  17. MyBatis(3)
  18. Linux c fopen() 与fclose() 使用
  19. 开源的「变」与「恒」:七大开源基金会负责人尖峰对谈
  20. Android全屏显示隐藏状态栏

热门文章

  1. linux创建虚拟声卡,Pear BIOS 安装和配置指引
  2. mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php
  3. 桌面图标摆放图案_用图标制作醒目的图案
  4. 关于移动应用APP数据安全的一点见解
  5. Java java.lang.SecurityException: Prohibited package name
  6. 函数式编程工具:filter和reduce
  7. Spring Security3源码分析-http标签解析(转)
  8. 2019.04.24笔记
  9. SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建
  10. Spring boot整合Mongodb