ES6入门之Symbol
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...in
、for...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相关推荐
- es6入门6--数组拓展运算符,Array.from()基本用法
本文只是作为ES6入门第九章学习笔记,在整理知识点的同时,会加入部分个人思考与解答,若想知道更详细的介绍,还请阅读阮一峰大神的ES6入门 一.拓展运算符 ES6中新增了拓展运算(...)三个点,它的作 ...
- ES6入门之对象的扩展
1. 属性的简洁表示法 在ES6中 允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁. const f = 'a' const b = {f} b // {f: 'a'}等同于 c ...
- ES6 入门教程 9 数组的扩展 9.1 扩展运算符
ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 ES6 入门教程 9 数组的扩展 9.1 扩展运算符 9.1.1 含义 9.1 ...
- es6入门到五连绝世之三杀(triple kill )
es6入门到五连绝世之三杀(triple kill ) 欢迎来到e6语法笔记教学 一.Promise 简介 1.1.Promise 异步执行顺序 1.2.自定义 promise 1.3.自定义Prom ...
- es6入门到五连绝世之四杀(quadra kill )
es6入门到五连绝世之四杀(quadra kill ) 欢迎来到e6语法笔记教学 一.symbol 数据类型 1.1.介绍及使用 欢迎来到e6语法笔记教学 这篇博客的记录手法,是通过 demo 记录 ...
- ES6入门笔记(一)
ES6入门笔记(一) 安装babel 由于浏览器对ES6的支持还不是很好,编写ES6代码前我们要安装一个babel工具将ES6代码编译成ES5代码,用如下命令安装babel: npm install ...
- ES6 中的 Symbol 是什么?
前言 记得刚找工作那会,几种数据类型是必问题,当时的答案一般都是七种--字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null). ...
- ES6入门学习资源共享
以下是收集的一些ES6学习资源,希望能帮助大伙: 学习ES6新特性: http://www.cnblogs.com/ziyunfei/ exploring-es6 https://leanpub.co ...
- es6入门到五连绝世之一血(first blood)
es6入门到五连绝世之一血(first blood) 欢迎来到e6语法笔记教学 一.变量声明 1.1.变量声明有三种方式 1.2.JS中的块级作用域,var.let.const 三者的区别 1.2.1 ...
最新文章
- 网页制作的中的一些工具代码
- CentOS安装libpcap
- spark shell的运行模式汇总
- python绘制散点图的函数_python matplotlib更新函数的散点图
- C语言(CED)编写程序,求sum=1*1*1+2*2*2+3*3*3+4*4*4+5*5*5+····+n*n*n
- 整理综合布线系统中材料用量的计算公式
- pku 1149 PIGS(最大流)
- 修改Hosts不生效的解决办法
- Linux架设DNS服务器(ChinaITLab.com 搜集整理)
- 齐鲁工业大学计算机学院复试名单,齐鲁工业大学2019年硕士研究生拟录取名单公示...
- C++中带.h与不带.h的头文件
- 编程需要那些数学和计算机知识点,学习编程需要哪些基础?
- Unity 3分钟,将你的Terrin 地形转为FBX
- 【paper吐槽】【SelfSupervised Learning】Self-Supervised Image Restoration with Blurry and Noisy Pairs
- Missionaries from the global south try to save the godless West
- 电子病历模板编辑器_这几个邮件模板网站,帮助提升工作效率
- MyBatis(3)
- Linux c fopen() 与fclose() 使用
- 开源的「变」与「恒」:七大开源基金会负责人尖峰对谈
- Android全屏显示隐藏状态栏
热门文章
- linux创建虚拟声卡,Pear BIOS 安装和配置指引
- mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php
- 桌面图标摆放图案_用图标制作醒目的图案
- 关于移动应用APP数据安全的一点见解
- Java java.lang.SecurityException: Prohibited package name
- 函数式编程工具:filter和reduce
- Spring Security3源码分析-http标签解析(转)
- 2019.04.24笔记
- SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建
- Spring boot整合Mongodb