设为首页 收藏本站
查看: 942|回复: 0

[经验分享] ES6新特性:增加新类型:Symbol

[复制链接]

尚未签到

发表于 2017-2-25 09:59:59 | 显示全部楼层 |阅读模式
  本文所有Demo的运行环境都为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用
  ES6新增了一种数据类型:SymbolSymbol是用来定义对象的唯一属性名的不二之选;

  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] = 1;
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 infor 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( "1111" );
let bar = Symbol.for("1111");
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 1;
yield 2;
yield 3;
};
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));
DSC0000.png

  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 10;
}
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346902-1-1.html 上篇帖子: ES6新特性:利用解构赋值 (destructuring assignment), 简化代码 下篇帖子: ios开发环境配置及cordova安装与常用命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表