两分钟读懂ES6的Symbol

介绍

ES6新增加的原始数据类型Symbol,它不能用new创建实例,因为他和undefinednull一样都是原始数据类型。

Symbol 表示独一无二的值,即使传入相同参数的两个Symbol,他们也不是等价的:

Symbol(1)==Symbol(1) //false
Symbol(1)===Symbol(1) //false

转换

Symbol 不会被隐式转换为数字或字符串

1+Symbol('1') //Uncaught TypeError: Cannot convert a Symbol value to a number
'1'+Symbol('1') // Uncaught TypeError: Cannot convert a Symbol value to a string

但是可以通过调用方法进行显式转换

Symbol('1').toString() // -> "Symbol(1)"  转字符串
!Symbol('1') // -> false 转布尔值

/*但是不能转为数值*/
Number(Symbol('1')) // -> VM1652:1 Uncaught TypeError: Cannot convert a Symbol value to a number

基本使用

作为对象的键名

在我们为对象扩充属性时,经常会不小心覆盖之前的属性,由于Symbol的唯一性,我们可以用Symbol作为键名使用:

const name=Symbol()
const people={}
/*务必这样创建属性,如果写为people.name则会吧name解析为字符串,相当于people['name']*/
people[name]='tom' 
console.log(people.name) // => undefined 这里其实是在访问people['name']
console.log(people[name]) // 'tom'

用Symbol创建的属性不会被遍历到,有一个Object.getOwnPropertySymbols方法,可以获得指定对象的所有Symbol属性名。

const obj = {};
let a = Symbol('a');
let b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

const objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols) // => [Symbol(a), Symbol(b)]

重用

使用Symbol.for()可以重用同一个Symbol值,并注册到全局环境以便搜索。

// 搜索标记为foo的Symbol,没有则创建
const s1 = Symbol.for('foo');
const s2 = Symbol.for('foo');

s1 === s2 // true

查询登记名称

使用Symbol.keyFor查询Symbol注册名称。

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

总结

想详细了解的去读阮一峰的原文,不过symbol这个东西的用处确实不大,简单了解基础部分就够了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,760评论 19 139
  • 1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象...
    赵然228阅读 4,185评论 2 10
  • 1. 概述 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数...
    ForeverYoung20阅读 4,106评论 1 0
  • ES6引入了一种新的原始数据类型Symbol,表示读一无二的值,它是js语言的第七种数据类型,前六种undefin...
    南蓝NL阅读 2,865评论 0 1
  • 在《反心灵鸡汤》的百度百科中提到下面这几句文字 又一天过去了。今天过得怎么样, 梦想 是不是更远了? 每次看到穷游...
    简书小二阅读 4,729评论 3 10