Javascript 为什么array.indexOf(未定义)不';如果数组是稀疏的,则无法工作

Javascript 为什么array.indexOf(未定义)不';如果数组是稀疏的,则无法工作,javascript,arrays,indexof,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。我知道这个方法

我是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。我知道这个方法的compare by==,但是我使用了一个参数关键字undefined。如果我将方法参数更改为“undefined”,它也不起作用(但这对我来说是显而易见的)。有人能给我解释一下,告诉我在数组中查找未定义值的最简单方法是什么吗

这实际上会在数组中找到一个
未定义的
值,问题是数组
a
中没有任何
未定义的
值,因此它返回-1表示没有找到任何值。您的阵列看起来像:

[*未初始化*,1]

在第一个位置不放任何内容并不意味着它填充了一个未定义的
,它只是没有初始化/不存在

如果您做了如下操作:

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);
    }
}
var a=[];
a[1]=1;
对于(变量i=0;i
这将打印未初始化数组值的索引。这实际上与
indexOf
不同的原因是
a[i]
将计算为
undefined
,如果:

(1) 元素存在且其值
未定义
,或


(2) 元素根本不存在
indexOf
但是会跳过数组中的这些“间隙”。

一般来说,JavaScript中的数组是稀疏的,它们可能有洞(这就是为什么
indexOf()
返回
-1
),因为数组只是从索引到值的映射。您正在查找的数组称为密集数组

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


请看一看这篇文章,我希望它能帮助你

我想补充一点,如果原始海报的目标是试图找到他还没有赋值的第一个索引,他可以使用循环,并以这种方式检查
未定义的
是JavaScript中的一个原语,所以它是自己的东西,您拥有的是一个空索引,它在分配给它之前不存在。因此,当
indexOf()
在数组中查找
未定义的
时,它实际上是在查找该值,如果它为数组中每个未填充的索引返回一个值,它将继续进行上述可能的重复,
未定义的
有点用词不当,它实际上是一个特定的原语值,所以它实际上是定义的,而不是字面上的未定义,这就是当你有一个未设置索引的数组时得到的结果。谢谢你的回复!!现在一切都清楚了!
var a = Array(undefined, undefined, undefined) 
a.indexOf(undefined) //0