Symbol

// Symbol.unscopables 将属性排除在 with (严格模式不能写with)环境之外

Symbol("foo") === Symbol("foo"); // false

var sym = new Symbol(); // TypeError

这会创建一个显式的符号包装器对象而不是一个新的符号值。
围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持
然而,现有的原始包装器对象,如 new Boolean、 new String以及new Number因为遗留原因仍可被创建
创建一个原始包装器对象(wrapper object),可以使用 Object() 函数:
var sym = Symbol("foo");
typeof sym; // "symbol"
var symObj = Object(sym);
typeof symObj; // "object"

Object(123) // new Object(123)

在全局符号注册表中创建和检索共享符号:
Symbol.for(key)
使用给定的key搜索现有符号,如果找到则返回符号。否则将得到一个新的使用给定的key在全局符号注册表中创建的符号。
Symbol.keyFor(sym)
为给定符号从全局符号注册表中检索一个共享符号键。

获取对象上的符号属性(不可枚举)。
Object.getOwnPropertyNames() 只会包含字符串类型的属性键



The Symbol.unscopables well-known symbol is used to specify an object value of whose own and inherited property names are excluded from the with environment bindings of the associated object.