JavaScript符号类型:(非字符串对象键)

JavaScript Symbol type: (non-string object keys)

本文关键字:字符串 对象 符号 类型 JavaScript      更新时间:2023-09-26

什么是"符号";在ECMAScript 6规范草案中提到的javascript类型?

引用规格:

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

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

符号值有一个名为[[Private]]的可观察属性,其不可变值为true或false。专用符号是其[[private]]属性的值为true的symbol值。

我以为对象键只是字符串,我并不孤单。引用这个公认的SO答案:

…对象键总是字符串…

你能解释一下符号类型是什么,并演示一下它的用法吗。我想弄清楚的规格

谢谢!

我以为对象键只是字符串

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

我想弄清楚的规格

这只是一个草案,变化很快。符号的使用方式以及是否或如何由任意脚本创建似乎还没有确定(扫描版本以了解更改)。

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

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

例如,您可以在第8.1.7.4节中看到它们的使用。对于Symbol构造函数的拟议用途(以及仍然存在的问题/开放问题),请查看这些strawman页面或此wiki网站。

Symbol是作为ECMAScript 6:的一部分提出的语言的新添加

ECMAScript的当前工作™

关于未来ECMAScript的工作™版本继续作为先前发布的ECMAScript的一部分™ "和谐"项目关于ECMAScript的当前工作的更多细节";和谐"在这个Wiki上进行了描述。该标准的第六版目前正在开发中,目标完成日期为2013年12月。

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

如何实现:让我们用"半径";属性

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.