在ES6之前的原始数据类型:undefined、Null、Boolean、Number、 String、Object 今天来看一下新增的 Symbol 有什么作用
let s1 = Symbol()
let s2 = Symbol()
console.log(s1) // Symbol()
console.log(s2) // Symbol()
console.log(s1 === s2) // false
let s1 = Symbol('foo')
let s1 = Symbol('bar')
console.log(s1) // Symbol(foo)
console.log(s2) // Symbol(bar)
console.log(s1 === s2) // false
const obj = {
name: 'UU'
// toString(){
// return this.name // Symbol(UU)
// }
}
let s = Symbol(obj)
console.log(s) // Symbol(\[object Object])
- 当参数是个对象的时候,会自动调用该对象的toSrting方法,将他转换成字符串
Symbol 是一个不能重复的字符串
description
// description
let s = Symbol('foo')
console.log(s.description) // foo
Symbol.for()
let s1 = Symbol.for('foo')
let s2 = Symbol.for('foo')
console.log(s1 ==== s2) // true
- 通过 Symbol.for()去创建的值相当于是一个全局的环境中
- 通过 Symbol() 去创建的值并不会在一个全局环境中
function foo(){
return Symbol.for('foo')
}
const x = foo()
const y = Symbol.for('foo')
console.log(x === y) // true
- 只要是使用 Symbol.for()去定义的值,不管是不是在方法里面都是存在全局环境中的
Symbol.keyFor
const s1 = Symbol('foo')
console.log(Symbol.keyFor(s1)) // undefined
const s2 = Symbol.for('foo')
console.log(Symbol.keyFor(s2))
Symbol常见的应用场景
const grade = {
'张三': { address: 'xxx', let:'111' },
'李四': { address: 'yyy', let:'222' },
'李四': { address: 'zzz', let:'333' }
}
console.log(grade) // 只输出了张三和李四两个数据
- 在对象里面 key 必须是唯一的,如果有重复的后定义的数据会把前面定义的数据覆盖掉
const stu1 = Sybmol('李四')
const stu2 = Sybmol('李四')
const grade = {
\[stu1]: { address: 'yyy', let:'222' },
\[stu2]: { address: 'zzz', let:'333' }
}
console.log(grade) // 可以输出两个李四
console.log(grade\[stu1])
console.log(grade\[stu2])
const sym = Sybmol('123')
class User {
constuctor(name){
this.name = name
this.sym = '123.com'
}
getName() {
return this.name + this.\[sym]
}
}
const user = new User('UU')
console.log(user.getName())
for( let key in user){
console.log(key)
}
- 通过for in 是无法输出 Syboml 定义的属性
for(let key of Object.keys(user)){
console.log(key) // 也是无法输出 Sybmol 的属性
}
Reflect.ownKeys()
for(let key of Reflect.ownKeys(user)){
console.log(key) // 可以取到全部属性
}