【发布时间】:2015-09-10 20:03:49
【问题描述】:
在 ES6 中属性可以定义为符号属性:
var symbol = Symbol();
var object = {};
object[symbol] = 'value';
MDN 将可枚举属性定义为“可以通过 for..in 循环迭代的属性”(1)。符号属性永远不会被 for...in 循环迭代,因此它们可以被认为是不可枚举的 (2)。
那么,您可以这样做是否有意义:
Object.defineProperty(object, symbol, {
value: 'value',
enumerable: true
});
并且查询对象的描述符确实确认该属性是可枚举的:
Object.getOwnPropertyDescriptor(object, symbol)
// -> { enumerable: true }
为什么?这有什么用?
(1)https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties
(2) for...in 使用[[Enumerate]],它只包含字符串键。既然我们有了符号属性,可能应该更改 MDN 上的定义。
【问题讨论】:
-
为什么不允许?你可以反过来问:如果普通属性默认是可枚举的,为什么它们可以设为不可枚举?请注意,确保我了解您的用途...
-
在
for ... in迭代中是否显示了一个带有其键符号的可枚举属性? (似乎那样会有问题。) -
关键是它们仍然不可枚举——它们仍然没有在 for...in 或 Object.keys 中被枚举——所以从所有意图和目的来看,它们都是不可枚举的,但是他们说在描述符中是可枚举的。
-
@FelixKling:可以吗? I can't,带 FF38。规范说it shouldn't。
-
所以要明确一点,
[[OwnPropertyKeys]]也会返回符号。Object.assign只是查看可枚举标志,无论该值是普通键还是符号。所以,是的,因为符号的enumerable标志也是true默认情况下,它们被复制。似乎它们只在for/in/of循环中被特殊对待。