总结

符号是 JS 新引入的基本类型值,它用于创建不可枚举的属性,并且这些属性在不引用符号的情况下是无法访问的。

虽然符号类型的属性不是真正的私有属性,但它们难以被无意修改,因此在需要提供保护以防止开发者改动的场合中,它们非常合适。

你可以为符号提供描述信息以便更容易地辨识它们的值。全局符号注册表允许你使用相同的描述信息,以便在不同的代码段中共享符号值,这样相同的符号值就可以在不同位置用于相同目的。

Object.keys()Object.getOwnPropertyNames() 不会返回符号值,因此 ES6 新增了一个 Object.getOwnPropertySymbols() 方法,允许检索符号类型的对象属性。而你依然可以使用 Object.defineProperty()Object.defineProperties() 方法对符号类型的属性进行修改。

“知名符号” 使用了全局符号常量(例如 Symbol.hasInstance),为常规对象定义了一些功能,而这些功能原先仅限内部使用。这些符号按规范使用 Symbol. 的前缀,允许开发者通过多种方式去修改常规对象的行为。