Symbol
1. 概述
ES6引入一种新的原始数据类型,Symbol,它是JavaScript中的第七种数据类型。
// 1.symbol 值通过Symbol函数生成。故,对象的属性名现在可以有两种类型,一种是字符串,一种是Symbol 类型。属性名属于 Symbol 类型的属性都是独一无二的,不会与其他属性名产生冲突。
let prop = Symbol()
console.log(typeof prop); // symbol
// 2.Symbol函数前不能使用new命令。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。是一种类似于字符串的数据类型。
// Symbol函数接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
let s1 = Symbol('foo')
let s2 = Symbob('bar')
// 3.若Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值。
let obj = {
toString(){
return `value`
}
}
let sym = Symbol(obj)
console.log(sym); // Symbol(value)
// 4.Symbol函数的参数仅表示对当前Symbol值的描述,具有相同参数的Symbol函数返回值是不同的。
let s1 = Symbol()
let s2 = Symbol()
console.log(s1===s2); // false
let s3 = Symbol('foo')
let s4 = Symbol('bar')
console.log(s3===s4); // /false
// 5.Symbol值不能与其他值进行运算
let s = Symbol()
console.log("object"+s); // Uncaught TypeError: Cannot convert a Symbol value to a string
// Symbol 可以显示的转换为字符串
let s = Symbol('my symbol')
console.log(s.toString()); // Symbol(my symbol)
// Symbol 可以转换为Boolean值,但是不能转换为数值
let sym = Symbol()
console.log(Boolean (sym)); // true
console.log(!sym); // false
console.log(Number(sym)); // TypeError
console.log(sym+2); // TypeError
2.Symbol.prototype.description
ES2019提供description属性,直接返回对Symbol的描述。
let sym = Symbol('my symbol')
console.log(sym.description); // my symbol
3.作为属性名的Symbol
Symbol 值都是不相等的,故Symbol 值可以作为标识符,用于对象的属性名,就不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
let mySymbol = Symbol()
let a ={}
a[mySymbol] = 'value'
let b ={
[mySymbol]:'hello'
}
let c = {}
Object.defineProperties(c,mySymbol,{value:'Hello'})
// Symbol值作为对象属性名时,不能用点运算符,使用点运算符会将Symbol当成字符串。
let mySymbol = Symbol()
let a = new Object()
a.mySymbol = 'Hello'
console.log(a[mySymbol]); // undefined
console.log(a['mySymbol']); // Hello