let o={}
let p1=Symbol("prop1");
let p2=Symbol("prop2");
let p3=Symbol("prop3");
o[p1]=1;
o[p2]=2;
o[p3]=3;
o.val1='v1';
o.val2='v2';
o[Symbol.iterator]=function*(){
yield this.val1;
yield this.val2;
}
//使用Symbol.iterator 让对象变得可迭代
for(let v of o){
console.log(v)
}
//symbol创建的属性名 无法被for in遍历
for(let v in o){
console.log(v)
}
//需要遍历对象中的symbol属性 可以使用getOwnPropertySymbols()获取对象的symbol属性名数组 包含 Symbol.iterator
let len=Object.getOwnPropertySymbols(o).length;
for(let i=0;i<len;i++){
//打印对象中的symbol属性
console.log( `${Object.getOwnPropertySymbols(o)[i].toString()}:${o[Object.getOwnPropertySymbols(o)[i]]}`)
}
//修改对象中的symbol属性的值
//方法1:使用定义时的变量
o[p1]='update1';
o[p2]='update2';
o[p3]='update3';
//方法一打印修改后的对象
console.log(o);
//方法2:getOwnPropertySymbols
//例如:修改对象中Symbol("prop1")属性名对应的值
for(let i=0;i<len;i++){
//通过判断Symbol(prop1)属性名来修改 如果存在多个Symbol(prop1)同名 则同名都会被修改
if(Object.getOwnPropertySymbols(o)[i].toString()==='Symbol(prop1)'){
o[Object.getOwnPropertySymbols(o)[i]]='我被修改啦'
}
}
//方法二打印修改后的对象 注意【console.log的打印特性,打印对象展开时会以对象最终状态显示。控制台查看方法一打印结果,点击展开会和方法二打印结果相同。】
console.log(o);
//Symbol.for(); 以相同字符串调用时 永远返回相同的值
let s=Symbol.for('shared');
let t=Symbol.for('shared');
console.log(s===t);//true
console.log(s.toString());
//Symbol(); 以相同字符串调用时 永远返回不相同的值
let sym =Symbol('str');
let sym2=Symbol('str');
console.log(sym===sym2);//flase
console.log(sym.toString());