这篇翻译不完整。请帮忙从英语翻译这篇文章

这个术语页面描述了一种称为 “symbol” 的数据类型,还有一个像类的函数 “Symbol()”,用来创建 symbol 数据类型实例。

数据类型 “symbol” 是一种原始数据类型,它的性质在于可以使用此类型的值来创建匿名的对象属性。此类型作为一个私有对象属性的键,用于类或对象类型的内部使用。例如,symbol 类型的键存在于各种内置的 JavaScript 对象中。同样,自定义类也可以这样创建私有成员。symbol 数据类型具有非常明确的目的,异乎寻常的单功能性;一个 symbol 实例可以被分配给L值,可以被用于身份检查,这就是全部;没有其他操作符的运用(与 “Number” 的实例对比,例如整数 42,它具有将值与其他类型的值进行比较或组合的运算符)。

一个具有数据类型 “symbol” 的值可以被称为 “符号值”。在 JavaScript 运行时环境中,一个 symbol 值通过调用函数 Symbol() 创建,动态的生成了一个匿名,唯一的值。唯一合理的用法是存储 symbol,然后使用存储的值创建对象属性。以下示例使用 var 创建一个变量来保存 symbol。

var  myPrivateMethod  = Symbol();
this[myPrivateMethod] = function() {...};

当一个 symbol 类型的值在属性赋值语句中被用作标识符,该属性(像这个 symbol 一样)是匿名的;并且是不可枚举的。因为这个属性是不可枚举的,它不会在循环结构 “for( ... in ...)” 中作为成员出现,也因为这个属性是匿名的,它同样不会出现在 “Object.getOwnPropertyNames()” 的返回数组里。这个属性可以通过创建时的原始 symbol 值访问到,或者通过遍历 “Object.getOwnPropertySymbols()” 返回的数组。在之前的代码示例中,通过保存在变量 myPrivateMethod的值可以访问到对象属性。

内置函数 “Symbol()” 是一个不完整的类,当作为函数调用时会返回一个 symbol 值,试图通过语法 “new Symbol()” 作为构造函数调用时会抛出一个错误。它有一些静态方法来访问 JavaScript 全局 symbol 表,还有一些静态属性用来保存已存在通用对象里的特定 symbol 地址。通过 Symbol() 函数创建 symbol 值已在上面解释过。理解试图将 Symbol()作为构造函数使用会抛出错误可以提前预防意外(当作构造函数使用)创建对象导致的混乱。访问全局 symbol 注册表的方法是 Symbol.for()Symbol.keyFor();它们斡旋在全局 symbol 表(或注册表)与运行时环境之间。symbol 注册表通常构建在 JavaScript 编译器基础设施,所以 symbol 注册表的内容不会出现 JavaScript 运行时环境,除了通过它们的反射方法。Symbol.for("tokenString") 方法从注册表返回一个 symbol 值,Symbol.keyFor(symbolValue) 方法从注册表返回 token 字符串;每个都是对方的相反,所以以下为 true:

Symbol.keyFor(Symbol.for("tokenString"))=="tokenString";  // true

Symbol 类具有一些静态属性,对于匿名命名来说,这带有一点讽刺意味。这类属性只有几个; 它们是为了所谓的“众所周知”的 symbol 而存在。 这些是在某些内置对象中找到的某些特定方法属性的 symbol。 这些 symbol 的曝光使得可以直接访问这些行为; 这样的访问可能是有用的,例如在自定义类的定义中。 普遍的 symbol 的例子有:“Array.iterator”用于类似数组的对象,“Symbol.search”用于字符串对象。

Symbol()函数及其创建的 symbol 值可能对设计自定义类的编程人员有用。 symbol 值提供了一种自定义类可以创建私有成员的方式,并维护一个仅适用于该类的 symbol 注册表。 自定义类可以使用 symbol 值来创建“自有”属性,这些属性避免了不必要的被偶然发现带来的影响。 在类定义中,动态创建的 symbol 值将保存到作用域变量中,该变量只能在类定义中私有地使用。 没有 token 字符串; 作用域变量起到 token 的等同作用。

Symbol 是JavaScript的原始数据类型,Symbol实例是唯一且不可改变的.  在其他编程语言中 symbol也被称为原子(atoms).

JavaScript中, Symbol 是 基本数据类型 的一种,Symbol 对象是 Symbol原始值的封装

Symbol 可以有可选的描述,但仅用于调试目的。

Symbol 类型是 ECMAScript 6 (es6) 中新添加的特性,在ECMAScript 5中没有对应的类型。

Symbol("foo") !== Symbol("foo")
const foo = Symbol()
const bar = Symbol()
typeof foo === "symbol"
typeof bar === "symbol"
let obj = {}
obj[foo] = "foo"
obj[bar] = "bar"
JSON.stringify(obj) // {}
Object.keys(obj) // []
Object.getOwnPropertyNames(obj) // []
Object.getOwnPropertySymbols(obj) // [ foo, bar ]

更多

文档标签和贡献者

标签: 
 此页面的贡献者: 7anshuai, zhuangyin, ReggieLee, fengma, JoeyChen
 最后编辑者: 7anshuai,