// Symbol 声明的变量独一无二 { let a1 = Symbol(); //Symbol 前面不能用new,因为生成的Symbol是一个原始类型的值,不是对象 let a2 = Symbol(); console.log(a1===a2) //false let a3 = Symbol.for('a3'); //Symbol.for(),接受一个参数,作为key值,在作用域内搜索,有没有以这个参数命名的值,如果有,就返回Symbol值,没有就创建一个以该参数命名的Symbol值 let a4 = Symbol.for('a3'); console.log(a3===a4) //true } { // let a = 'abc'; let a = Symbol.for('abc'); let obj = { [a]:'111', //取a1变量作为key值,用Symbol得到的key值用let of和for in是取不到Symbol的key值的 abc:'345' } console.log(obj) //for in ,let of 获取常规键名 for(let [key,value] of Object.entries(obj)){ console.log('let of ',key,value) //abc 345 } //Object.getOwnPropertySymbols方法,获取指定对象的所有 Symbol 键名 // 得到的是一个数组,可以调用数组的方法 Object.getOwnPropertySymbols(obj).forEach(function(item){ console.log(obj[item]) //111 }); //Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名 Reflect.ownKeys(obj).forEach(function(item){ console.log(item,obj[item]) // abc 111 Symbol(abc) "111" }) }
可以参考ES6文档:ES6 symbol