快速了解Es6中的Symbol

2019-01-02  本文已影响0人  秦声

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]

如有问题望大牛指点

上一篇 下一篇

猜你喜欢

热点阅读