为什么 array.indexOf(undefined) 在数组稀疏的情况下不起作用

Why array.indexOf(undefined) doesn't work if array is sparse

本文关键字:情况下 不起作用 数组 indexOf array undefined 为什么      更新时间:2023-09-26

我是 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值,问题是您的数组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

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

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

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

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

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

请看一下这篇文章,希望对您有所帮助