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]
网友评论