【问题标题】:Why array.indexOf(undefined) doesn't work if array is sparse如果数组稀疏,为什么 array.indexOf(undefined) 不起作用
【发布时间】:2016-03-11 20:52:43
【问题描述】:

我是 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。如果我将方法参数更改为“未定义”,它也不起作用(但这对我来说很明显)。有人可以解释一下并告诉我在数组中找到未定义值的最简单方法是什么?

【问题讨论】:

  • undefined 是 JavaScript 中的一个原语,所以它是它自己的东西,你所拥有的是一个空索引,在你分配它之前它不存在。因此,当indexOf() 在数组中查找undefined 时,它实际上是在寻找该值,如果它返回数组中每个未填充索引的值,它将永远持续
  • 如上所述,undefined 有点用词不当,它实际上是一个特定的原始值,所以它实际上是定义的,而不是字面上的未定义,它当你有一个未设置索引的数组时,你会得到什么。
  • 感谢您的回复!!现在一切都清楚了!

标签: javascript arrays indexof


【解决方案1】:

这实际上会在数组中找到一个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 但是会跳过数组中的这些“间隙”。

【讨论】:

  • 我会补充说,如果原始发布者的目标是尝试找到他尚未分配值的第一个索引,他可以使用循环并以这种方式检查跨度>
【解决方案2】:

一般来说,JavaScript 中的数组是稀疏——它们可能有漏洞(这就是indexOf() 返回-1 的原因),因为数组只是一个从索引映射到值。您要查找的数组称为 dense 它看起来像

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

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

请看this的帖子,希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多