7

本 ECMAScript 6 草案规范中提到的“符号”javascript 类型是什么?

引用规范:

Symbol 类型是可用作 Object 属性键的所有非字符串值的集合。

每个可能的符号值都是唯一且不可变的。

符号值有一个名为 [[Private]] 的可观察属性,其不可变值为真或假。私有符号是一个符号值,其 [[Private]] 属性的值为真。

我认为对象键只是字符串,而且我并不孤单。引用这个接受的 SO 答案

…对象键总是字符串…</p>

你能解释一下符号类型是什么,并演示它的用法吗?我试图理解规范。

谢谢!

4

3 回答 3

6

我认为对象键只是字符串

你是对的,但这仅适用于 EcmaScript 5。ES 6 / 和谐是新事物的草稿!

我正在尝试理解规范

它只是一个草稿,变化很快。符号的使用方式以及它们是否或如何由任意脚本创建似乎尚未确定(扫描版本以查找更改)。

如果您向下滚动到该文档的最后(甚至在附件 F 下方),例如,您将看到第 8.4.4 节:已移出的符号异国对象。它指出

Exotic Symbol 对象为所有基本的内部方法提供了替代定义。

例如,您可以在第 8.1.7.4 节众所周知的符号和内在函数中看到它们的使用情况。对于Symbol构造函数的建议用途(以及仍然存在的问题/未解决的问题),请查看这些 稻草人页面或此 wiki 站点

于 2013-07-20T13:15:55.033 回答
0

Symbol是作为ECMAScript 6的一部分提出的语言的新增内容:

ECMAScript™ 的当前工作</p>

作为先前宣布的 ECMAScript™“Harmony”项目的一部分,未来 ECMAScript™ 版本的工作将继续进行。有关 ECMAScript “Harmony”当前工作的更多详细信息,请参阅此 Wiki。该标准的第六版目前正在开发中,目标日期为 2013 年 12 月完成。

于 2013-07-20T07:22:17.170 回答
0

我们使用符号将对象的属性或方法设为私有。所以我们隐藏了细节,只展示了要点。它被称为abstraction

如何实现:让我们创建一个具有“radius”属性的简单类

class Circle {
    constructor(radius) {
        this.radius = radius; 
    }}

符号本质上是一个唯一标识符。每次我们调用这个函数时,我们都会得到一个唯一的标识符。不过,它不是构造函数。

Symbol()===Symbol() //will be false

执行:

const _radius=Symbol()
class Circle {
    constructor(radius) {
    this[_radius] = radius; //since property name starts with _, we use bracket notation
        }
         }

现在测试一下。创建一个 Circle 的实例:

const c=new Circle;
console.log(Object.getOwnPropertyNames(c))// you will see a number on the console.
于 2019-06-05T03:46:51.173 回答