前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >ES6: 符号类型

ES6: 符号类型

作者头像
宅蓝三木
发布2024-10-09 20:58:00
发布2024-10-09 20:58:00
5100
代码可运行
举报
文章被收录于专栏:三木的博客三木的博客
运行总次数:0
代码可运行

引入原因:

  • 实现私有属性 let s = Symbol() let obj = {[s]: ‘hello world’}; console.log(obj.s); //undefined
  • 符号值唯一 let s = Symbol() let m = Symbol() console.log(s === m)

创建:

  • 不能用字面量形式创建
  • 使用Symbol(desc)函数创建,不需要添加new
  • Symbol.for(key)在全局符号注册表中查找key符号值,如果找到就返回,没找到就创建一个新的符号值
  • Symbol.keyFor(symbol): 返回符号值的key

枚举:

  • 符号类型的key是不能被枚举的,Object.keys()以及Object.getOwnPropertyNames()都不能返回符号类型的key
  • Object.getOwnPropertySymbols()则会返回对象中所有符号类型的key

共享符号值:

  • Symbol.for(desc): 在全局符号注册表中查找描述为desc的符号,如果找到,返回这个符号值,如果没有,则创建一个新的符号值并返回
  • Symbol.keyFor(var): 返回全局符号注册表中符号值为var的desc.

转换:

  • 不能强制转化为字符串或者数值类型, 所以 symbol + “hello” 或者 symbol/1 会报错
  • 可以调用String()来转换

知名符号:

Symbol.hasInstance(obj): 判断obj是不是当前函数的实例,如ArraySymbol.hasInstance; 可以通过以下代码改变instanceof的默认行为: Object.defineProperty(MyObject, Symbol.hasInstance, {

代码语言:javascript
代码运行次数:0
复制
  value: function(v) {
      return false;
  }

});

Symbol.isConcatSpreadable let collection = {

代码语言:javascript
代码运行次数:0
复制
  0: "Hello",
  1: "world",
  length: 2,
  [Symbol.isConcatSpreadable]: true

}; let messages = [ “Hi” ].concat(collection); console.log(messages.length); // 3 console.log(messages); // [“hi”,”Hello”,”world”]

Symbol.match 、 Symbol.replace 、 Symbol.search 、Symbol.split

Symbol.toPrimitive function Temperature(degrees) {

代码语言:javascript
代码运行次数:0
复制
  this.degrees = degrees;

} Temperature.prototype[Symbol.toPrimitive] = function(hint) {

代码语言:javascript
代码运行次数:0
复制
  switch (hint) {
  case "string":
      return this.degrees + "\\u00b0"; // 温度符号
  case "number":
      return this.degrees;
  case "default":
      return this.degrees + " degrees";
  }

}; let freezing = new Temperature(32); console.log(freezing + “!”); // “32 degrees!” console.log(freezing / 2); // 16 console.log(String(freezing)); // “32°”

Symbol.toStringTag

age[Symbol.toStringTag] = ‘Node’; ‘Node’ age { age: 32, [Symbol(Symbol.toPrimitive)]: [Function], [Symbol(Symbol.toStringTag)]: ‘Node’ } age.toString(); ‘[object Node]’

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档