迭代和枚举数组,得不到相同的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代和枚举数组,得不到相同的结果相关的知识,希望对你有一定的参考价值。

我必须通过这行代码的测试,并在阅读各种帖子后,确保我正在迭代一个数组而不是枚举尝试避免原型链接等可能的并发症(说实话我不明白一切我到了那里)。

我有两段代码似乎在做同样的事情,只有一个是枚举,一个是迭代。然而,让我把头发拉出来的部分是,如果我枚举然后我通过所有测试,但如果我迭代然后我没有,我失败的部分说“应该从源到目的地复制属性”

这是迭代:

function copy(destination, source){
var index;
for (index = 0; index <= source.length; index++) {
  if (source.propertyIsEnumerable(index) && destination[index] === undefined) {
    destination[index] = source[index];
  }
}
return destination;

我将名为“source”的函数中的第二个参数传递给第一个名为“destination”的函数。

现在当我把枚举代码放入I传递所有测试时:

function copy(destination, source){
var index;
for (var index in source) {
  if (source.propertyIsEnumerable(index) && destination[index] === undefined)
    destination[index] = source[index];
}
return destination;
};

现在我相信他们正在做同样的事情,但看起来他们不是吗?

答案

迭代版本在这样的示例上失败。两个版本都复制索引元素,但只有枚举版本复制数组对象的命名属性。

var oldArray = [1, 2, , 4];
oldArray.someProp = "foo";

var newArray1 = copyArrayIter(oldArray);
console.log(newArray1);
console.log(newArray1.someProp);

var newArray2 = copyArrayEnum(oldArray);
console.log(newArray2);
console.log(newArray2.someProp);

function copyArrayIter(source) {
  var index;
  var destination = [];
  for (index = 0; index <= source.length; index++) {
    if (source.propertyIsEnumerable(index) && destination[index] === undefined) {
      destination[index] = source[index];
    }
  }
  return destination;
}

function copyArrayEnum(source) {
  var index;
  var destination = [];
  for (var index in source) {
    if (source.propertyIsEnumerable(index) && destination[index] === undefined)
      destination[index] = source[index];
  }
  return destination;
};

以上是关于迭代和枚举数组,得不到相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL 4.5中迭代自定义结构unifrom数组

C#中的枚举器和迭代器

动手动脑

为啥此代码片段返回意外结果?

带有红宝石集合/可枚举的酷技巧和富有表现力的片段[关闭]

如何在UL中迭代使用appendChild和片段LI?