javascript - 您可以使属性在 javascript 中可枚举但不可迭代吗?

标签 javascript ecmascript-6

我只是想知道是否有一种方法可以使对象属性像在 for in 循环中一样可枚举,但不会出现在 for of 循环 中,有点像

Object.defineProperty({},'prop',{
    enumerable:true,
    iterable:false
}

如果没有,是否有计划实现这样的功能?或者 for of 循环是否使用可枚举属性

最佳答案

我在 Mozilla 开发网络 (MDN) 上进行了一些挖掘。

原来对象有一个obj.propertyIsEnumerable(prop)检查属性是否可枚举的方法。从 MDN 中给出的示例来看,通过原型(prototype)链继承的属性是不可枚举的,因此该方法为这些属性返回 false。

不可枚举属性的一个示例是构造函数和属性 length数组。

对于问题的可迭代部分,我将引用 MDN:“ECMAScript 6 中的可迭代是一个接口(interface)(或者换句话说,一个协议(protocol)),而不是像 Array 或 Map 这样的对象类型”。

也就是说,对象需要实现这个接口(interface),才能使其属性可迭代。内置可迭代对象(例如 String、Array、Map、Set、WeakSet 和 Generator 对象)就是这种情况。

下面的代码说明了这一点:

var aString = "hello"
typeof aString[Symbol.iterator] // "function"
aString[Symbol.iterator]() + "" // "[object String Iterator]"
[...aString]                    // ["h", "e", "l", "l", "o"]

当然,您可以定义自己的迭代器实现。

回到问题,附加到对象或其原​​型的属性(直接,意思不是通过继承)将在 for...in 中显示为可枚举的。环形。对于可迭代对象,您需要一个实现,可以是之前提到的实现,也可以是您自己的实现。这是来自 MDN 的一个很好的例子。

let arr = [ 3, 5, 7 ];
arr.foo = "hello";

for (let i in arr) {
   console.log(i); // logs "0", "1", "2", "foo" these are property names or indexes
}

for (let i of arr) {
   console.log(i); // logs "3", "5", "7" these are actual values of an
                   // iterable implementation provided by the array prototype
}

let在此上下文中,关键字等同于 var定义(虽然它有更多的含义,但它们超出了本文的范围)。

如您所见,数组已经实现了 iterable接口(interface)(来自数组原型(prototype)),因此它在使用 for...of 时产生它的值循环,而 foo不显示属性(既不显示值也不显示属性名称)。

因此,如果您的对象没有实现 iterable接口(interface),它不应该是可迭代的(原则上),因此它将在 for...of 中显示其属性循环。

关于javascript - 您可以使属性在 javascript 中可枚举但不可迭代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24877452/

相关文章:

javascript - JavaScript 库中组件的大小?

JavaScript 上下文箭头函数

node.js - Sass 与 webpack 的相对导入

javascript - ES6 默认参数为空对象?

javascript - React-Redux 中的 mapStateToProps 中的状态参数是什么

javascript - 简单的 Leaflet + Mapbox TitleLayer 有问题吗?

javascript - 如何在 Chrome 开发者工具中禁用 JavaScript?

javascript - 使用Winston Logger登录/var/log失败

javascript - 通过游标的 jquery 弹出消息

javascript - 并行创建 Promise