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最低版本要 ...
随机推荐
- leetcode-Excel Sheet Column Title
题目: 把数字转化为excel形式的字符表示.示例:1->A 2->B 3->C ... 26->Z 27->AA... 解题思路: 乍一看有点像进制转换题目,不过细想想 ...
- Android 之窗口小部件详解--App Widget
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
- 第27章 结构型模式大PK
27.1 代理模式 VS 装饰模式 27.1.1 代理模式 (1)场景:客人找运动员代理要求安排运动员参加比赛 (2)说明:代理人有控制权,可以拒绝客人的要求,也可以答应安排,甚至自己下去跑(因为有些 ...
- 第16章 调色板管理器_16.4 一个DIB位图库的实现(2)
//接上一篇 //DibPal.h /*----------------------------------------------------------------- DIBPAL.H heade ...
- HOLOLENS如何调节屏幕亮度和音量?
圆环左边的两个是亮度按键,右边的是两个音量按键,值得注意的是,无论是两个音量键还是亮度键,它们都被设置成了一凸一凹,凸的按键为音量/亮度+键,凹为-键,其工业设计可见一斑.
- bzoj2748[HAOI2012]音量调节(背包问题的方案)
Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...
- [Cache] C#操作缓存--CacheHelper缓存帮助类 [复制链接]
using System;using System.Web;using System.Collections; namespace DotNet.Utilities{ public class Cac ...
- 快速判断素数 --Rabin-Miller算法
以前我在判断素数上一直只会 sqrt(n) 复杂度的方法和所谓的试除法(预处理出sqrt(n)以内的素数,再用它们来除). (当然筛选法对于判断一个数是否是素数复杂度太高) 现在我发现其实还有一种方法 ...
- [LINK]OpenResty
http://openresty.org/ http://www.tuicool.com/articles/M3yI3y http://www.oschina.net/question/28_6046 ...
- [py]给函数传递数组和字典
一 , 1.1传元组 def fun(x): print x t=(1,2) fun(t) 1.2传元组 #传元组 def fun(x,y): print x,y # t=(1,2) t=(1,2,3 ...