ES6-Symbol
javaScript的数据类型:number,string,boolean,undefined,null,object
ES6带来了一个新的数据类型:symbol
目的是:解决对象的属性名冲突的问题。
let sm1=Symbol();
let sm2=Symbol();
console.log(sm1); //Symbol()
console.log(sm2); //Symbol()
console.log(typeof sm1) //symbol
console.log(sm1===sm2) //false
从测试可以发现 虽然sm1和sm2看起来很一样,但他们其实是不相等的。为了让不同的Symbol看起来不一样,我们可以通过参数来实现:
let sm1=Symbol('sm1');
let sm2=Symbol('sm2');
console.log(sm1); //Symbol(sm1)
console.log(sm2); //Symbol(sm2)
参数就像是Symbol的描述,用来区分看起来相同,实则不同的Symbol,但要注意,即使描述相同,sm1和sm2也不同,毕竟他们本来就是不同的东西。
下面我们来看用Symbol解决对象属性命名冲突的注意问题:
(1)当symbol值作为对象的属性名时,不能用点号来取得对应的属性值。
let name=Symbol();
let person={
[name]:'Lily' //以Symbol作为属性名name
};
console.log(person[name]) //Lily
console.log(person.name) //undefined 不能用点号来取得对应的属性值
(2)当symbol值作为对象的属性名时,也不能用点号来设置对应的属性值
let name=Symbol();
let person={}
paseon.name='Lily' //以Symbol作为属性名name,以点号赋值。
console.log(person[name]) //undefined 不能用点号来设置对应的属性值
console.log(person['name']) //Lily
console.log(person.name) //Lily
可以看出,当用点号赋值时,其实javascript就不会把点号后的值理解为symbol类型,而是字符串类型,就相当于没有使用symbol
(3)如何遍历symbol类型的属性名:Object.getOwnPropertySymbols()
let name=Symbol();
let person={
[name]:'Lily' , //symbol类型
'age':12 //string类型
};
Object.keys(person) //['age']
for(let key in person){
console.log(key) // age
}
我们发现使用Object.keys()和for...in都无法遍历出symbol类型的属性。
我们可以用Object.getOwnPropertySymbols()来获取symbol类型的属性:
Object.getOwnPropertySymbols(person) // [Symbol(name)]
(4)获取对象上的所有属性名:Reflect.ownKeys()
Reflect.ownKeys(person) // ['age',Symbol(name)]
(5)用Symbol.for()创建全局变量
let sm1=Symbol.for('name');
let sm2=Symbol.for('name');
之前我们说过,在用Symbol创建变量时,即使描述相同,两个变量实际也是不同的(console.log(sm1===sm2) //false )。
但这里,我们用Symbol.for()来创建得到的结果是:
console.log(sm1===sm2) //true
原因是:使用Symbol.for()来创建的symbol值被登记在全局环境中,以便用Symbol.for()来搜索。也就是使用Symbol创建的symbol值是无法用Symbol.for()来搜索的。
let sm1=Symbol('name');
let sm2=Symbol.for('name');
console.log(sm1===sm2) //false
(6)Symbol.keyFor() 返回一个被登记在全局环境中的symbol值的key,没有返回undefined
let sm1=Symbol.for('name');
Symbol.keyFor('sm1') //name
let sm1=Symbol('name');
Symbol.keyFor('sm1') // undefined
ES6-Symbol的更多相关文章
- es6 Symbol类型
es6 新增了一个原始类型Symbol,代表独一无二的数据 javascript 原来有6中基本类型, Boolean ,String ,Object,Number, null , undefined ...
- ES6 Symbol数据类型和set-map 数据结构
Symbol数据类型 ES6新加的数据类型,提供一个独一无二的值 { let a1 = Symbol() ;let a2 = Symbol() } //声明 { let a3 = Symbol.for ...
- ES6 Symbol的应用场景
一.简介 具体使用请参考:API ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(B ...
- ES6 symbol 以及symbol的简单应用
前置 1.ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值. 2.Symbol 值通过Symbol函数生成. 3.Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实 ...
- Es6 Symbol.iterator
Symbol.iterator 为每一个对象定义了默认的迭代器.该迭代器可以被 for...of 循环结构使用. --描述 当需要迭代一个对象的时候(比如在 for...of 循环的开始时),它的 @ ...
- ES6——Symbol数据类型
什么是 Symbol ? Symbol 表示独一无二的值,他是js中的 第七种数据类型. 基本的数据类型:null, undefined number boolean string symbol 引用 ...
- JavaScript ES6 Symbol.hasInstance的理解。
Symbol.hasInstance 本案例是结合阮一峰老师的ECMAScript 6 入门丛书进一步的详细介绍,和对Symbol.hasInstance的理解.本着互联网的精神,分享给大家. 对象的 ...
- ES6 Symbol类型 附带:Proxy和Set
七种数据类型 ·Symbol ·undefined ·null ·Boolean ·String ·Number ·Object let a = Symbol('this is a symbol'); ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
- 深入浅出ES6(八):Symbols
作者 Jason Orendorff github主页 https://github.com/jorendorff 你是否知道ES6中的Symbols是什么,它有什么作用呢?我相信你很可能不知道, ...
随机推荐
- C#获取本机mac地址
添加System.Management的引用, using System.Management; string mac = ""; ManagementClass mc = new ...
- Mac OS X 卸载MySQL
sudo rm /usr/local/mysqlsudo rm -rf /usr/local/mysql*sudo rm -rf /Library/StartupItems/MySQLCOMsudo ...
- TStringList 的Sorted属性
1 .设置 sorted := true; 2.添加数据 add('3');add('4');add('1'); showmessage(commatext);// 1,3,4 3.再修改Sorted ...
- Struts2 的验证
概述 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 –基于 XWork Validation Framework 的声明式验证:Struts2 提供了一些基 ...
- MonoRail MVC应用(2)-构建多层结构的应用程序
习惯了分层结构的.NET开发了,当然也是分层有优势,所以在使用MonoRail进行网站构建时,首先考虑到的问题就是MonoRail如何应对分层的结构.问题1:MonoRail在WEB层没有根目录,必须 ...
- 合理利用 vs2013的性能分析跟诊断
选择对应的项目==> 我正常是选择采样 就包括里面的一些耗时. 挺好用的. 可以根据热路径 还有访问的占比.知道哪个环节占用的访问时间 还有性能耗能多. 可以点进去 跟踪跟修改
- zookeeper启动失败无法查看status-----用户权限
最近一直在调试zookeeper,总是出现莫名其妙的问题 QuorumPeerMain 进程存在,但是无法查看status, JMX enabled by defaultUsing config: / ...
- SharePoint 2010 BCS - 概述
博客地址 http://blog.csdn.net/foxdave SharePoint 2010首次引入了BCS的概念 - Business Connectivity Service,即业务连接服务 ...
- windows azure中国 里面建立一个虚拟机,与虚拟机建立通信 里面部署IIS,外网访问
在windows azure中国 里面建立一个虚拟机,里面部署IIS,外网不能访问么? 外网访问的地址是给的那个DNS地址 ,比如我的是 DNS 名称 urbanairserver.cloudapp. ...
- C++11 不抛异常的new operator
在google cpp style guide里面明确指出:we don't use exceptions C++11的noexcept关键字为这种选择提供了便利. C++11以前,提及malloc和 ...