快速了解Es6中的Symbol


Symbol是Es6中的一个新特性,它是一个基本数据类型。

javascript从Es6起,基本数据类型变为6种 , undefined、null、Number、String、Boolean、Symbol。

Symbol的目的就是为了实现一个,唯一不重复的值,Symbol值它不能运算。

Symbol值它是唯一的,两个Symbol值比较都不会相等。

var s1 = Symbol()
var s2 = Symbol()
console.log(s1 == s2)  //false

Symbol函数可以接收字符串作为一个参数,表示对Symbol值的描述,主要是为了好区分。

var s1 = Symbol('Symbol')
var s2 = Symbol(123)

console.log(s1)  //Symbol(Symbol)
console.log(s2) //Symbol(123)

有时,我们希望重新使用同一个 Symbol 值,Symbol.for方法可以做到这一点,Symbol.for方法是全局的,简单的来说就是登记过的,如果是Symbol()值,会每次都会生成一个新的Symbol值,都是不同的。

var s1 = Symbol.for(123)
var s2 = Symbol.for(123)

console.log(s1 == s2)

上面代码中,s1和s2都是 Symbol 值,但是它们都是同样参数的Symbol.for方法生成的,所以实际上是同一个值 , Symbol值参数是描述。


Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key描述。

var s2 = Symbol.for(123)
console.log(Symbol.keyFor(s2)) // 123 

var s1 = Symbol(123)        
console.log(Symbol.keyFor(s1))  // undefined

上面代码中,获取出来的是描述是字符串类型的,不管Symbol值的参数是什
么,获取出来的都是String类型,只能获取登记过的Symbol值。


Symbol值作为对象的属性名的几种方法。

var s1 = Symbol(123)
var obj = {}
obj[s1] = 123
console.log(obj)  //{Symbol(123): 123}

var json = {
    [s1] : 123
}
console.log(json) //{Symbol(123): 123}

上面代码要使用[]括号原因是,把它Symbol值当做一个变量解析,如果不写[]括号的话,会被当做一个字符串。


Symbol值的内置属性就只有一个常用,将对象转换为iterator可遍历接口对象。

const obj= {};
obj[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

[...obj] // [1, 2, 3]

如有问题望大牛指点

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

推荐阅读更多精彩内容

  • 概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加...
    oWSQo阅读 554评论 1 3
  • 1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象...
    赵然228阅读 828评论 2 10
  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,857评论 0 1
  • 本文为阮一峰大神的《ECMAScript 6 入门》的个人版提纯! babel babel负责将JS高级语法转义,...
    Devildi已被占用阅读 2,042评论 0 4
  • “フライトNH874 763、Osaka行きにお乗りのお客様にご案内いたします。 ご搭乗の手続きは45分後に终了い...
    懋鱼阅读 253评论 0 0