代码之家  ›  专栏  ›  技术社区  ›  Trevor

在一个未定义的数组上有循环吗?

  •  1
  • Trevor  · 技术社区  · 6 年前

    我有一个用户正在根据这段代码生成岗哨报告 Cannot read property 'values' of undefined

    var self = this;
    if (self.queue()) {
        return self.queue().some(function (item, index) {
            return item.values[key] == value;
        });
    } else {
        return false;
    }
    

    self.queue() 是可以观察到的。 这怎么可能?做 array.some 循环遍历空数组?或者有什么奇怪的现象 some 函数附加到真正的数组,而数组正在被循环编辑?

    显而易见的答案是这样做

    var self = this;
    if (self.queue()) {
        return self.queue().some(function (item, index) {
            if (item && item.values) {
                return item.values[key] == value;
            }else{
                return false;
            }
        });
    } else {
        return false;
    }
    

    但我看不出为什么我要这么做。

    我用的是 一些 功能错误?在循环遍历数组之前,需要先复制它吗?

    谢谢

    -编辑

    根据Gmaiolo的例子和Alexey Lebedev的评论在node中进行测试

    // let arr = [null, undefined, 0, 'something', undefined, 3]
    let arr = [null, , , 'something', , 3]
    console.log("test 1:");
    for (const value of arr) {
        console.log(value)
    }
    console.log("\ntest 2:");
    arr.forEach(function(item){
        console.log(item);
    });
    console.log("\ntest 3:");
    arr.some(function(item){
        console.log(item);
        return false;
    });
    

    结果

    test 1:
    null
    undefined
    undefined
    something
    undefined
    3
    
    test 2:
    null
    something
    3
    
    test 3:
    null
    something
    3
    

    在节点8.11中测试

    1 回复  |  直到 6 年前
        1
  •  3
  •   GMaiolo    6 年前

    undefined null 值它仍然是数组的元素,因此,回答特定问题:

    是的 , Array.some 将在填充有 未定义 元素。


    话虽如此,我们可以用 Array.values :

    let arr = [null, undefined, 0, 'something', undefined, 3]
    const iterator = arr.values()
    
    for (const value of iterator) {
      console.log(value) // output: null, undefined, 0, "something", undefined, 3
    }