ES6新特性:增加新类型:Symbol
本文所有Demo的运行环境都为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 ;
ES6新增了一种数据类型:Symbol,Symbol是用来定义对象的唯一属性名的不二之选;
Symbol如何使用
Symbol如何使用呢, Symbol不是一个构造函数哦, 如果用new Symbol的话, 会报错的:
- var sym1 = Symbol();
- var sym2 = Symbol("foo");
- var sym3 = Symbol("foo");
- console.log(sym1, sym2, sym3) //输出Symbol() Symbol(foo) Symbol(foo)
连自己都不等于自己:
- //用同样的参数创建两次, 也是不相等的:
- Symbol("foo") === Symbol("foo"); //输出:false
作为属性名的Symbol;使用Symbol给对象添加唯一的属性, Symbol也能作为对象的函数名;
- let obj = {};
- let sAttr0 = Symbol("hehe");
- let sAttr1 = Symbol("meme");
- obj[sAttr1] = ;
- console.log(obj[sAttr1]);
- obj[sAttr0] = () => {
- return ++obj[sAttr0];;
- };
我们可以用typeof判断某一个变量类型为Symbol类型:
- typeof Symbol() === 'symbol' //输出:true
- typeof Symbol('foo') === 'symbol' //输出: true
- typeof Symbol.iterator === 'symbol' //输出 : true
如果我们不知道Symbol的实例名字是什么,我们怎么获取到Symbol值的呢, Symbol无法被for in , for of循环,以及Object.keys, Object.values 等都无法遍历到Symbol的属性; Object下给我们提供了一个getOwnPropertySymbols;
- let sym0 = Symbol("o_o?");
- let obj = {
- [sym0] : "heheda"
- }
- for( let prop of Object.getOwnPropertySymbols(obj) ) {
- //prop就是Symbol的名字
- console.log( obj[prop] ); //输出:heheda
- };
或者用ES6提供的反射 : Reflect.ownKeys, 反射?
- let sym0 = Symbol("o_o?");
- let obj = {
- [sym0] : "heheda"
- }
- console.log( Reflect.ownKeys(obj) ); //输出:[ Symbol(o_o?) ]
Symbol.for和 Symbol.keyFor
Symbol.for和Symbol的唯一区别是 Symbol.for创建的两个实例可能相等, 根据Symbol的参数生成实例, 如果参数一样, 那么会返回同一个实例;
- let foo = Symbol.for( "" );
- let bar = Symbol.for("");
- console.log( foo === bar ); //输出: true
- //只有通过Symbol.for创建的对象,才能用keyFor找到原来的参数;
- console.log(Symbol.keyFor(foo)) //会输出:1111
Symbol的属性以及这些属性的用处:
Symbol.prototype: Symbol有指向的原型:
- console.log(Symbol.prototype); //输出Symbol的原型
Symbol.length: Symbol的length为1, 也就是说调用Symbol需要一个参数, 当然不给参数也没啥事。
Symbol.Iterator:对象的Symbol.Iterator属性, 指向这个对象的默认遍历器:
- var myIterable = {};
- myIterable[Symbol.iterator] = function* () {
- yield ;
- yield ;
- yield ;
- };
- console.log([...myIterable]); // [1, 2, 3]
Symbol.match:ES6中字符串去匹配对象的Symbol.match方法, 匹配的结果完全可控, 以下Demo,相当于把字符串"strstring"作为obj[Symbol.match]方法的参数, 然后返回用户设定的值, chrome和FF目前还不支持:
- let obj = {
- [Symbol.match](string) {
- console.log(string);
- return "heheda";
- }
- };;
- console.log("strstring".match(obj));
Symbol.replace:和上面的道理一样:
- let obj = {
- [Symbol.replace](string) {
- console.log(string);
- return "replllll";
- }
- };
- console.log( "sssss".replace(obj) ); //输出: sssss replllll
Symbol.split:和上面的道理一样。
Symbol.toPrimitive:对象的Symbol.toPrimitive指向一个方法, 当对象转化为原始值得话, 会调用这个方法, 一个对象转为原始值由三种情况:string, number, default:
- var obj1 = {};
- console.log(+obj1); // NaN
- console.log(`${obj1}`); // "[object Object]"
- console.log(obj1 + ""); // "[object Object]"
- // obj2有定义Symbol.toPrimitive属性;
- var obj2 = {
- [Symbol.toPrimitive](hint) {
- if (hint == "number") {
- return ;
- }
- if (hint == "string") {
- return "hello";
- }
- return true;
- }
- };
- console.log(+obj2); // 10 -- 转化 为 "number"
- console.log(`${obj2}`); // "hello" -- 转化 为 "string"
- console.log(obj2 + ""); // "true" -- 转化 为 "default"
Symbol.toStringTag:Symbol.toStringTag, 这个玩意儿厉害了, 连对象的toString方法都给改了,而且用Object.prototype.toString.call这个对象 输出也是一样的, 这个情何以堪, 以后判断元素类型必须用别的方法了, 改动大了.... :
- console.log({ [Symbol.toStringTag] : "str "}.toString()); //输出:[object str ]
- console.log(Object.prototype.toString.call({ [Symbol.toStringTag] : "str "}))
- //输出:[object str ]
- class Collection { get [Symbol.toStringTag]() { return 'xxx'; } } var x = new Collection(); console.log(x.toString())// 输出:"[object xxx]"
参考:
mdn:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
阮一峰ECMAScript 6 入门:http://es6.ruanyifeng.com/#docs/symbol
作者: NONO
出处:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830
ES6新特性:增加新类型:Symbol的更多相关文章
- C# 9.0 新特性预览 - 类型推导的 new
C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...
- JDK1.8新特性——使用新的方式遍历集合
JDK1.8新特性——使用新的方式遍历集合 摘要:本文主要学习了在JDK1.8中新增的遍历集合的方式. 遍历List 方法: default void forEach(Consumer<? su ...
- JDK1.8之后的新特性和新接口
接口的旧特性: 就特性下接口中只有: 常量(必须赋值) 抽象方法abstract(和final static private三个关键字冲突) interface Inter { //int a ; / ...
- ES6的新特性(13)——Symbol
Symbol 概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突. ...
- C++_新特性2-RTTI运行阶段类型识别
这部分属于C++的新特性,感觉比较高阶的特性.我把它归于属于奇技淫巧的范畴.了解即可. RTTI是运行阶段类型识别(Runtime Type Identification)的简称. 这是添加到C++中 ...
- [PHP7.0-PHP7.2]的新特性和新变更
php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...
- Kubernetes1.3新特性:新的资源回收控制器
(一) 核心概念 在kubernetes1.3中新增了一个资源回收控制器GarbaseCollector,用这个控制器来替代kubernetes1.3中的资源回收控制器GC. 如下为kubernet ...
- 再来看看Java的新特性——其他新特性
关于剩余Java8新特性知识点总结,包含:默认方法.Optional.CompletableFuture.时间相关. 默认方法 默认方法皆在帮助Java新功能可以兼容低版本JDK已开发的程序. 比如说 ...
- HTML5 的新特性以及新标签的浏览器兼容问题
新特性: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 1) 拖拽释放(Drag and drop) API 2) 语义化更好的内容标签(heade ...
- hadoop3.0新特性及新功能
Hadoop-3.0.0-alpha2版本发布,相比之前的hadoop-2.x有一系列的功能增强.但目前还是个alpha版本,有很多bug,且不能保证API的稳定和质量. 主要变化 Java最低版本要 ...
随机推荐
- [每日菜单]lunch menu for Wednesday, February 24 2016
HIGHLIGHTS ** Boiled Broccoli原味西兰花 Steamed Turbot with Chili剁椒蒸多宝鱼 * Rye Bread黑麦面包 CHINESE CU ...
- NYOJ-取石子(二)
取石子(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 小王喜欢与同事玩一些小游戏,今天他们选择了玩取石子. 游戏规则如下:共有N堆石子,已知每堆中石子的数量,并且 ...
- PHP的文件操作常用函数
PHP文件操作 1 获得文件名:basename - 返回路径中的文件名部分 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名.如果文件名是以 suffix 结束的,那这一部分也会被 ...
- LoadRunner 12.02 安装教程及中文语言包安装
注意事项: 安装前,把所有的杀毒软件和防火墙关闭. 若以前安装过LoadRunner,则将其卸载. 安装路径不要带中文字符. LoadRunner 12已经不再支持xp系统,仅支持win7和win8系 ...
- 将pdf文件通过itunes直接拖到ipad的ibooks里面
开始不太清楚进行过什么设置,使得以前可以直接通过拖动的方式复制pdf文件到ipad里面的方法不管用了.在帖子http://bbs.weiphone.com/read-htm-tid-864091-pa ...
- ajax异步举例
SelectInfo = { release_url: "/compatible/getReleaseFor", project_url: "/compatible/ge ...
- Java手动添加SSL证书
出现错误为 SSLHandshakeException - unable to find valid certification path to requested target 在服务器上找到对应的 ...
- HashTable, HashMap, LinkedHashMap, ConcurrentHashMap
HashTable: 不允许null的key或value, 线程安全 HashMap: 允许一个null的key, 无限的null value, 非线程安全 LinkedHashMap: HashMa ...
- win7的优化-1:隐藏我的电脑导航栏里的收藏等项目
1. Type regedit in RUN or Start Menu search box and press Enter. It'll open Registry Editor. 2. Now ...
- PAT 1015. 德才论 (25)
宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子 ...