如果数组稀疏,为什么array.indexOf(undefined)不起作用

时间:2016-03-11 20:52:43

标签: javascript arrays indexof

我是JavaScript的新手,有一件事困扰着我。我有一个非常简单的代码:

var a = [];
a[1] = 1;

i = typeof(a[0]);
index = a.indexOf(undefined);
len = a.length;

console.log(a);
console.log("\n" + len);
console.log("\n" + i);
console.log("\n" + index);

我的问题是:为什么indexOf返回-1而不是0.我知道这个方法比较===,但我用作参数关键字 undefined 。如果我将方法参数更改为“未定义”它也不起作用(但这对我来说很明显)。有人可以解释一下这个并告诉我在数组中找到未定义值的最简单方法是什么?

2 个答案:

答案 0 :(得分:14)

这实际上会在数组中找到undefined值,问题是您的数组a中没有任何undefined值,因此返回 - 1意味着它没有找到任何。你的数组看起来像:

[*uninitialized*, 1]

你没有把任何东西放在第一个位置的事实并不意味着它填充了undefined,它只是没有初始化/不存在。

如果你做了类似的事情:

var a = [undefined, 1];
var index = a.indexOf(undefined);
console.log(index);

实际上它会按预期打印0

编辑:要回答有关如何查找未初始化值的问题,请执行以下操作

var a = [];
a[1] = 1;

for(var i = 0; i < a.length; i++){
    if(a[i] === undefined){
      console.log(i);
    }
}

这将打印未初始化的数组值的索引。与indexOf不同的是,这实际上有效的原因是a[i]将评估为undefined如果:{/ p>

(1)元素存在,其值为undefined

(2)元素根本不存在。 indexOf但是会​​跳过这些&#34;差距&#34;在阵列中。

答案 1 :(得分:4)

一般情况下,JavaScript中的数组 稀疏 - 它们可能有漏洞(这就是indexOf()返回-1)的原因,因为数组只是从索引到值的映射。您正在寻找的数组称为 密集 ,它看起来像

var a = Array.apply(null, Array(3)) 

var a = Array(undefined, undefined, undefined) 
a.indexOf(undefined) //0

请查看this帖子,我希望它能为您提供帮助