//Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名
// let obj={
// [Symbol('my_key')]:1,
// enum:2,
// nonEnum:3
// }
// let keys=Reflect.ownKeys(obj);
// keys.forEach((item,idx,keys)=>{
// console.log(item.toString());
// });
//由于以 Symbol 值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法
// let size = Symbol('size');
// class Collection {
// constructor() {
// this[size] = 0;
// }
// add(item) {
// this[this[size]] = item;
// this[size]++;
// }
// static sizeOf(instance) {
// return instance[size];
// }
// }
// let x = new Collection();
// console.log(Collection.sizeOf(x));
// x.add('foo');
// console.log(Collection.sizeOf(x));
// console.log(Object.keys(x));
// console.log(Object.getOwnPropertyNames(x));
// var symbolProerpties = Object.getOwnPropertySymbols(x); //[Symbol(size)]
//重用Symbol值
// let s1=Symbol.for('foo');
// let s2=Symbol.for('foo');
// console.log(s1===s2);
//Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key
// let s1=Symbol.for('foo');
// console.log(Symbol.keyFor(s1));
//Symbol.for登记的名字是全局环境的,
//可以在不同的iframe或service worker
//中取到同一个值
let iframe=document.createElement('iframe');
iframe.src=String(window.location);
document.body.appendChild(iframe);
console.log(iframe.contentWindow.Symbol.for('foo')===Symbol.for('foo'));
console