【问题标题】:JavaScript Symbol type: (non-string object keys)JavaScript 符号类型:(非字符串对象键)
【发布时间】:2013-07-20 07:17:34
【问题描述】:

什么是“符号”javascript类型as mentioned in this ECMAScript 6 draft specification

引用规范:

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

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

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

我认为对象键只是字符串,而且我并不孤单。引用this accepted SO answer

…对象键总是字符串…

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

谢谢!

【问题讨论】:

标签: javascript string object key ecmascript-6


【解决方案1】:

我认为对象键只是字符串

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

我正在尝试理解规范

这只是草稿,rapidly changing。符号的使用方式以及它们是否或如何由任意脚本创建似乎尚未确定(扫描versions 以了解更改)。

如果您向下滚动到that document 的最末端(甚至在附件 F 下方),例如,您将看到一个 Section 8.4.4: Symbol Exotic Objects 已移出那里。它指出

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

例如,您可以在 section 8.1.7.4 Well-Known Symbols and Intrinsics 看到它们的使用情况。对于 Symbol 构造函数的建议用途(以及仍然存在的问题/未解决的问题),请查看 these strawman pages 或 this wiki site

【讨论】:

    【解决方案2】:

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

    ECMAScript™ 的当前工作

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

    【讨论】:

    【解决方案3】:

    我们使用符号将对象的属性或方法设为私有。所以我们隐藏了细节,只展示了要点。它被称为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.
    

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2011-10-05
      • 2021-07-03
      相关资源
      最近更新 更多