Javascript 如何区分未定义的数组元素和空插槽?

Javascript 如何区分未定义的数组元素和空插槽?,javascript,arrays,undefined,Javascript,Arrays,Undefined,假设我是一名用户脚本开发人员,无法控制页面上的javascript。该页面创建具有随机长度的数组,用随机值(包括伪值,如未定义的)填充数组。并非每个元素都必须指定一个值,因此可能存在空插槽 一个简化的示例(Firefox控制台): var-arr=新数组(3); arr[0]=null; arr[1]=未定义; console.log(arr);\ \数组[null,未定义,] console.log(arr[1]);\ \未定义 console.log(arr[2]);\ \未定义 conso

假设我是一名用户脚本开发人员,无法控制页面上的javascript。该页面创建具有随机长度的数组,用随机值(包括伪值,如
未定义的
)填充数组。并非每个元素都必须指定一个值,因此可能存在空插槽

一个简化的示例(Firefox控制台):

var-arr=新数组(3);
arr[0]=null;
arr[1]=未定义;
console.log(arr);\ \数组[null,未定义,]
console.log(arr[1]);\ \未定义
console.log(arr[2]);\ \未定义
console.log(arr[1]==arr[2]);\ \真的
console.log(类型为arr[1]);\ \未定义
console.log(类型为arr[2]);\ \未定义
正如我们所看到的,Firefox显示未定义和空插槽的方式有所不同,而对于javascript,它们似乎是相同的

现在假设我想要清理这样一个数组,移除所有空插槽,但保留未定义的元素。如何执行此操作?

您可以使用运算符检查阵列是否有密钥。对于空插槽,它将返回false,但对于包含值(包括值
未定义的
)的插槽,它将返回true:

var arr = new Array(3);
arr[0] = null;
arr[1] = undefined;

1 in arr; // true
2 in arr; // false
请注意,您无法使用它来区分空插槽和超过阵列末端的插槽,但是如果您知道阵列的长度,那么您已经知道
3
不是阵列的一部分,因此您不需要在arr
中测试
3

您还可以像这样过滤掉空插槽:

arr = arr.filter( ( _, i ) => i in arr );
您可以使用,它省略了稀疏元素

var-arr=新数组(3);
arr[0]=null;
arr[1]=未定义;
控制台日志(arr);
var withoutSparse=[];
arr.forEach(函数(a,i){
控制台日志(i);
无解析。推(a);
});
console.log(不带解析)

作为控制台包装{max height:100%!important;top:0;}
什么是空插槽?你想要一个新数组吗?哇,这太聪明了。@paul如果空槽在数组的中间[null,undefined]?@Shivam除了要检查的索引外,对这个答案没有任何改变:
1在arr
中为假,但是
0在arr
中为真,而
2在arr
中为真。
arr = arr.filter( ( _, i ) => i in arr );