SOURCE

//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 命令行工具 X clear

                    
>
console