Symbol新数据类型
symbol解决了 重命名的问题,解决对象的属性名冲突。
描述信息 每个Symbol都是独一无二的 通过遍历是获取不到symbol 使用 Object.getOwnPropertySymbols
let name2 = Symbol("name"); let age = Symbol("age"); let name1 = Symbol("name"); console.log(name1); console.log(name1 == name2);//false
不能遍历
let obj = { name: '名字', [name1]: "shdkjdshg", [name2]: "sdfhs" } console.log(Object.keys(obj));//数组长度为1 for (let key in obj) { console.log(key);//name 不能遍历Symbol }
在对象中,获取symbol 要加 []
let sym = Symbol(); console.log(sym); let sym2 = Symbol(); console.log(sym == sym2);//false 每个Symbol都是独立的 //对象 let obj = { name:"张三", [sym]:"Symbol太厉害了" } console.log(obj.sym);//undefined console.log(obj[sym])// Symbol太厉害了//[}
symbol常用方法:
1、Object.getOwnPropertySymbols函数 获取symbol类型的属性
console.log(Object.getOwnPropertySymbols(obj)); Object.getOwnPropertySymbols(obj).forEach(item => { console.log(item); })
2、Reflect.ownKeys函数 同时获取字符串类型的属性和获取symbol类型的属性
console.log(Reflect.ownKeys(obj)); Reflect.ownKeys(obj).forEach(item => console.log(obj[item]))
3、Symbol.for函数 函数作用:根据参数名,去全局环境中搜索是否有以该symbol.for()参数为名的symbol值,有就返回它,没有就以该参数名来创建一个新的symbol值
let n1 = Symbol.for('name'); let n2 = Symbol.for('name'); console.log(n1==n2);//true let n3 = Symbol('name'); console.log(n1==n3);//false
4、KeyFor 函数作用:返回一个以被登记在全局环境中的symbol值的key,没有就返回undefined。
全局的symbol
let sym1 = Symbol.for("name")
如果name在全局未创建,则会在全局创建Symbol
如果name已经创建了,则会返回全局的Symbol
let n3 = Symbol('name'); console.log(n1==n3);//false console.log(Symbol.keyFor(n1));//name console.log(Symbol.keyFor(n3));//undefined