我必须通过这一行代码的测试,并阅读了各种有关确保我正在迭代数组而不是为了避免原型链等而避免枚举的枚举。(老实说,我没有理解一切,但是我到达那里了。
我有两段似乎在做同一件事的代码,只有一个正在枚举,一个正在迭代。但是,让我拔头发的部分是,如果我枚举然后通过了所有测试,但是如果我进行迭代然后就没有通过,那么我说“应该将属性从源复制到目标”的部分将失败。
这是迭代:
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;
我正在将名为“源”的函数中的第二个参数传递给名为“目标”的第一个函数。
现在当我将枚举代码放入时,我通过了所有测试:
function copy(destination, source){
var index;
for (var index in source) {
if (source.propertyIsEnumerable(index) && destination[index] === undefined)
destination[index] = source[index];
}
return destination;
};
现在我相信他们在做同样的事情,但是看起来他们不是吗?
答案 0 :(得分:0)
在这样的示例中,迭代版本失败。这两个版本都复制索引元素,但是只有枚举版本复制数组对象的命名属性。
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;
};
它将复制索引0
,1
和3
上的元素,但不会复制someProp
属性。