Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环ES6中,函数调用为iterable_Javascript_Object_Ecmascript 6 - Fatal编程技术网

Javascript 在循环ES6中,函数调用为iterable

Javascript 在循环ES6中,函数调用为iterable,javascript,object,ecmascript-6,Javascript,Object,Ecmascript 6,寻找最佳实践建议 将函数调用作为iterable对象是否是一种好的做法 const obj = {key1:'a', key2:'b'}; for(const i of Object.keys(obj)){ ... } 或者更好 const obj = {key1:'a', key2:'b'}; const allKeys = Object.keys(obj); for(const i of allKeys){ ... } Object.keys函数不是在循环的每次迭代中都被调用吗?您的第

寻找最佳实践建议

将函数调用作为iterable对象是否是一种好的做法

const obj = {key1:'a', key2:'b'};

for(const i of Object.keys(obj)){ ... }
或者更好

const obj = {key1:'a', key2:'b'};
const allKeys = Object.keys(obj);
for(const i of allKeys){ ... }

Object.keys函数不是在循环的每次迭代中都被调用吗?

您的第一个示例执行与第二个示例相同的操作,只是没有
allKeys
常量。在您的第一个示例中:

const obj = {key1:'a', key2:'b'};

for(const i of Object.keys(obj)){ ... 

Object.keys
将只被调用一次,然后它的迭代器将被检索并用于循环。(这在规范中有介绍,但它…很繁重。)所以你可以使用这个表单,它不是低效的。

你可以通过模拟类似的情况来检查它

函数A(){
log('function called');
返回[1,2,3,4,5];
}
for(让我来举一个(){
控制台日志(i);

}
对象.键的调用在两种变体中仅进行一次

但是,也可以考虑< <代码> > <代码>循环,它不依赖于<代码>对象.KEY < /代码>:

for (const prop in obj) {  } 
Object.keys
创建一个数组,而上面的
for
循环不创建数组。后者仅在必要时检索项目。当然,如果您的
for
循环从未过早退出,它仍将检索所有这些循环,因此这只会在您计划过早退出循环时产生影响。在这种情况下,相应的迭代器从不访问其余的项,而
Object.keys
在创建数组时就已经访问了

需要注意的一件事是:为。。在
中,循环还将迭代可枚举的继承属性,而不仅仅是自己的属性,而
对象。键
将只列出自己的可枚举属性。您可以在
for
循环中添加额外的测试,以排除非自己的属性:

if (obj.hasOwnProperty(prop))

它们是等价的你当然可以,但最好了解实际发生的事情。当然应该是
中的
,而不是
中的
。谢谢你提到,@T.J.Crowder。啊……当然。出于某种原因,我没有注意到这一点。我建议调用重新继承属性的差异。我对您的断言感到好奇,“上面的
for
循环没有[创建数组]”,并且“只在必要时检索项目”。当然,它不会创建一个实际的数组,但我怀疑大多数或所有引擎都会准备一个包含所有键的内部列表,不是吗?