什么是“符号”javascript类型as mentioned in this ECMAScript 6 draft specification?
引用规范:
符号类型是可用作Object属性键的所有非String值的集合。
每个可能的符号值都是唯一且不可变的。
符号值具有一个名为[[Private]]的可观察属性,其不可变值为true或false。私有符号是一个符号值,其[[Private]]属性的值为true。
我认为对象键只是字符串,而我并不孤单。引用this accepted SO answer:
...对象键总是字符串......
您可以解释符号类型是什么,并演示其用法。我正试图理解规范。
谢谢!
答案 0 :(得分:6)
我认为对象键只是字符串
你是对的,但仅适用于EcmaScript 5。 ES 6 / harmony是新事物的草稿!
我正在尝试理解规范
这只是草稿,rapidly changing。如何使用符号以及是否或如何通过任意脚本创建它们似乎尚未解决(通过versions扫描更改)。
如果向下滚动到that document的末尾(甚至低于附件F),您将看到一个第8.4.4节:符号外来对象已被移出那里。它声明
Exotic Symbol对象为所有必要的内部方法提供了替代定义。
例如,您可以在section 8.1.7.4 Well-Known Symbols and Intrinsics看到它们的使用情况。对于Symbol
构造函数的建议用法(以及仍存在的问题/未解决的问题),请查看these strawman个网页或this wiki site。
答案 1 :(得分:0)
Symbol
是ECMAScript 6
目前关于ECMAScript™的工作
未来ECMAScript™版本的工作将继续作为之前宣布的ECMAScript™“Harmony”项目的一部分。关于ECMAScript“Harmony”的当前工作的更多细节在本Wiki上有所描述。该标准的第六版目前正在制定中,目标日期为2013年12月完成。
答案 2 :(得分:0)
我们使用符号将对象的属性或方法设为私有。因此,我们隐藏细节并仅显示要点。称为抽象。
如何实现:让我们创建一个具有“ 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.