- Symbol表示一个独一无二的值,防止对象属性名称的冲突
let s1=Symbol("foo")
let s2=Symbol("bar")
console.log(s1===s2) false
let mySymbol=Symbol()
let obj={}
obj[mySymbol]="hello" -------变量不能用.
let obj1={a:1}
let obj2={b:2}
Object.defineProperty(obj2,"b2",{
enumerable:false,
value:2
})
Object.setPrototypeOf(obj2,obj1)
console.log(obj2)
//遍历出对象自身和继承的可枚举的属性(不包含Symbol属性)
for(let k in obj2){
}
//遍历出对象自身可枚举的属性(不包含Symbol属性)
for(let k of Object.keys(obj2)){
}
//遍历自身对象的所有属性(包括不可枚举属性但不包括Symbol值作为名称的属性)
for(let k of Object.getOwnPropertyNames(obj2)){
}
let objSymbols=Object.getOwnPropertySymbols(obj2) //返回一个给定对象自身的所有 Symbol 属性的数组。
for(let s of objSymbols){
}
Symbol.for和keyFor的使用
let s1=Symbol("bar")
let s2=Symbol("bar")
console.log(s1===s2) false
//Symbol.for首先根据key检查是否存在,如果存在直接返回已有symbol
//如果不存在才会创建,并且放入全局环境中
let s3=Symbol.for("foo")
let s4=Symbol.foo("foo")
console.log(s3===s4)
let key=Symbol.keyFor(s3)
console.log(key)
//Symbol()不会在全局环境中注册
let key1=Symbol.keyFor(s1)
console.log(key1)