如何在JavaScript中检查特定数组索引处是否存在值?

541

这个代码可以用来测试位置为index的值是否存在,或者有更好的方法吗:

if(arrayName[index]==""){
     // do stuff
}

6
请注意,不想检查整个数组是否为空,只是想检查具有索引值“index”的特定位置。 - Ankur
标题可以改进为“如何在JavaScript中检查特定数组索引处是否存在值”。 - demisx
19个回答

766
在 JavaScript 中,数组的概念是包含 array.length 个元素,从 array[0]array[array.length - 1]。 如果索引 i 的数组元素在 0array.length - 1(包括两端)范围内,则定义为该数组的一部分。 如果不在此范围内,则不属于该数组。
因此,按照概念,数组是线性的,从零开始到最大值,并且没有任何机制可以在这个范围内存在“间隙”,其中没有条目。 要找出给定位置索引(其中索引为 0 或正整数)处是否存在值,只需使用:
if (i >= 0 && i < array.length) {
  // it is in array
}

实际上,JavaScript 引擎在底层分配数组空间时几乎肯定不会像这样线性且连续地分配,因为这对于动态语言来说没有多大意义,并且对于某些代码来说效率低下。它们可能是哈希表或一些混合策略,而数组的未定义范围可能并未分配自己的内存。尽管如此,JavaScript 语言希望以 array.length 的长度呈现数组的 n 成员,并将它们命名为从 0n-1,并且这个范围内的所有内容都是数组的一部分。

然而,你可能想知道的是数组中的值是否实际上是已定义的,也就是说,它不是 undefined。也许你甚至想知道它是否被定义并且不是null。可以向数组添加成员而不必设置它们的值:例如,如果通过增加 array.length 属性的方式添加数组值,则任何新值将为 undefined

要确定给定的值是否有意义,或者是否已被定义。也就是说,不是 undefined 或者 null

if (typeof array[index] !== 'undefined') {
或者
if (typeof array[index] !== 'undefined' && array[index] !== null) {

有趣的是,由于JavaScript的比较规则,我的最后一个示例可以被优化为以下代码:

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
很有可能原帖作者知道自己正在处理的数组类型,但为了完整起见:类数组对象通常也包含一个length属性,在这种情况下,后两个示例更加合适。 - Justin Johnson
10
你可以用foo != null来替换foo !== 'undefined' && foo !== null,意思不变且更通俗易懂。 - thinklinux
1
@TheComposer 根据Javascript语言,数组的大小由array.length定义,该数组包含从0array.length-1的所有元素。但并非所有这些值都是已定义的值。如果您在数组成员上使用delete关键字,则会将该成员设置回未定义状态,就像通过递增其array.length参数来扩展数组一样,新值将以未定义状态开始。实际上,Javascript实现可能会优化数组存储,并且某些或所有未定义值可能不占用任何内存。 - thomasrutter
1
array.length 不会迭代任何东西,它只是一个单独的数字。 - thomasrutter
2
这个答案不包括数组索引未设置的情况。 new Array(1)[0] === undefined 但值为空。 [undefined][0] === undefined 但是值被设置了;数组一个值。唯一完美的答案是使用inhasOwnProperty()-- idx in arrayarray.hasOwnProperty(idx)--根据此答案:https://dev59.com/M3E85IYBdhLWcg3wqVX5#39171620 - dx_over_dt
显示剩余9条评论

352

我们不能只是这样做吗:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

11
问题是如何测试数组中是否存在一个特定索引 - thomasrutter
27
if(arrayName.length) {... 会产生什么不同的结果? - siannone
14
为什么有这么多赞?这明显没有回答问题。 - algiogia
10
if(arrayName.length) {...}null 上会失败。 - Ronnie Royston
5
这会失败,并返回 [undefined, undefined],这是一个长度为2的数组。 - Soldeplata Saketos
显示剩余6条评论

44

仅使用.length不安全,可能会在某些浏览器中导致错误。这里是更好的解决方案:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

或者,我们可以使用:

Object.keys(__array__).length

2
请注意,不想检查整个数组是否为空,只需检查具有索引值“index”的特定位置。 - Oriol
对于那些想要检查整个数组的人来说,这是一个简洁明了的答案。 - Luis Martins
这个回答完全没有回答 OP 的问题,问题是要找出一个数组索引是否为空,而不是整个数组! - spacing

26
if(!arrayName[index]){
     // do stuff
}

9
如果数组的值存在但为0、null、""等,则这也会执行一些操作。 - thomasrutter
托马斯是正确的;然而,对于许多情况来说这已经足够了(你也应该列举出这些情况)。 - Justin Johnson
迄今为止最简单的方式 - the-breaker

9
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter 我在努力想出一种可能会导致数组元素未定义的方法。 - Rex M
嗯,(myarray[1] = undefinedvariable) 能行吗?还是只能用 (myarray[1] = undefined)? - thomasrutter
@thomasrutter 这两个都会抛出异常,是吗?(undefinedvariable未定义) - Rex M
2
你可以使用类似Firebug的工具自行测试。在Javascript中,读取未定义变量的值不会抛出异常 - 它会返回undefined值。 - thomasrutter
@thomasrutter,你在你的第一条评论中是错误的。x == null 只对 null 或 undefined 为真,其他情况都为假。同样,x != null 则对非 null 和 undefined 的任何内容都为真。除非你特别需要查找 undefined,否则就要利用隐式转换的好处。 - Marcus Stade
@macke 你说得对:x == null 只会匹配 null 或 undefined。我会编辑我的回答,谢谢。 - thomasrutter

8

简单通用的方法

如果您想检查任何数组是否具有虚假值(如false、undefined、null或空字符串),只需使用every()方法即可,如下所示:

array.every(function(element) {return !!element;}); // returns true or false

例如:

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

如果你需要获取第一个假值的索引,可以像这样操作:
let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

如果您只需要检查给定索引的数组中的 falsy 值,可以按照以下方式进行操作:
if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

7
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

如果你所说的'Null'是指其元素为null或等于'',那么:在过滤所有“null”元素后,检查数组是否为空。
if(!arr.clean().length){return 'is null'}

当然,在此之前要添加清理方法:
Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

6

这取决于你对“empty”的理解。

当您尝试获取对象上没有该名称的属性的值时,您将获得值undefined

这就是稀疏数组的情况:不是所有在0array.length-1之间的索引都存在。

因此,您可以检查array[index] === undefined

但是,属性index可能存在一个undefined值。如果您想过滤掉这种情况,可以使用in运算符或hasOwnProperty,如如何在JavaScript中检查对象是否具有属性?所述。

index in array;
array.hasOwnProperty(index);

如果您希望将具有undefinednull值的现有属性视为不存在,则可以使用松散比较array[index] == undefinedarray[index] == null
如果您知道该数组不是稀疏的,则可以将indexarray.length进行比较。但为了安全起见,您可能希望确保index确实是数组索引,请参见检查属性名称是否为数组索引

2
这是唯一一个正确区分未设置数组项(没有任何值)和设置为未定义值的项的答案。由于访问未设置的数组项返回未定义,因此这两种状态被模糊了,但它们是不同的。 - olivr
当你有一个可能未设置值的数组(与undefined或null不同)时,请使用hasOwnProperty。 - CMCDragonkai

5

I would recommend creating a function like this:

function isEmptyEl(array, i) {
   return !(array[i]);
}

您可以这样调用:
if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

强制开发人员遵守isEmptyEl接口可以捕获输入错误,例如未定义的arrayName或indexVal变量。

在Javascript编程时,通常最好进行防御性编程。

如果arrayName未定义,您将得到以下错误提示:

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

未定义的indexVal会出现类似的结果。

如果数组或索引值不存在,则会出现错误。

对于有效输入,只有在arrayName[indexVal]是以下任一内容时才会返回true:

  • null
  • undefined
  • NaN
  • 空字符串
  • 0
  • false

2
我想指出一些人可能忽略的事情:在数组中间可以有一个“空”的位置。考虑以下情况:
let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

自然的检查方法是查看数组成员是否未定义,我不确定是否存在其他方法。

if (arr[index] === undefined) {
  // member does not exist
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接