Javascript数组:将条目设置为未定义

Javascript数组:将条目设置为未定义,javascript,arrays,Javascript,Arrays,我有一个整数索引的数组 myarray[1]=val1 myarray[2]=val2 myarray[4]=val3 myarray[5]=val4 在这种情况下,myarray[0]和myarray[3]未定义且 for (var i in myarray) { console.log(i) } 产出1,2,4,5 我喜欢在不移动其他成员的情况下“删除”myarray[2] 删除之后,myarray[2]也变得未定义 并且输出应该是 1,4,5 I tredmyarray.splice

我有一个整数索引的数组

myarray[1]=val1
myarray[2]=val2
myarray[4]=val3
myarray[5]=val4
在这种情况下,myarray[0]和myarray[3]未定义且

for (var i in myarray)
{
 console.log(i)
}
产出1,2,4,5

我喜欢在不移动其他成员的情况下“删除”myarray[2] 删除之后,myarray[2]也变得未定义 并且输出应该是 1,4,5


I tred
myarray.splice(2,1,未定义)
但它仍然是输出索引2

使用
delete

delete myarray[2];
使用delete删除数组索引

>> myArray[2]
undefined
现在,您将不会使用for-in循环对其进行迭代

此外,for in应仅用于迭代对象的属性。在数组上迭代时使用常规for循环。

停止

第一个问题是,虽然js中的大多数内容都是对象,但不要使用for在数组中进行迭代。“for…in”表示对象文字。对数组使用普通的迭代循环

其次,“删除”旨在删除对象上的属性。同样,数组是对象,但这不是delete的正确用法

如果要将数组索引的值设置为undefined,只需将其赋值为undefined即可

myarray[2] = undefined;
编辑:

在阵列上不使用…的原因如下:

var x = [1,2,3];
x.test = 'abc';

for(var i in x){
    console.log(x[i]);
}
//1,2,3,abc

for(var i=0; i<x.length; i++){
   console.log(x[i]);
}
//1,2,3

希望这有帮助。

有什么原因不能这么做:
myArray[2]=未定义?您所说的“不移动其他成员”是什么意思?如果有区别,您可以完全删除密钥,或将其值设置为“未定义”。请看,您可以使用“delete”删除属性2,或者在不使用第三个参数的情况下使用splice(2,1)。@bfavaretto您是对的。在我测试了Barmar的答案之后,我意识到了这一点。但是看看期望的输出。听起来像是一个黑客的解决方案,这正是OP想要的。老实说,我真的不明白他在问什么,但我会用我认为他在问什么来修正我的答案。您几乎不应该使用for…in来迭代数组。它将返回对象上除数字键之外的任何属性。任何不可枚举属性,是。我想说的是,在这种情况下,似乎需要稀疏数组。尽管如此,
中针对..的
警告从来都不是不可取的。我还试图避免在..的情况下检查is值是否未定义。。在“仅获取相关索引”中,不使用if(myarray[i]!==undefined)是用于r。。。在数组索引上的迭代中?实际上delete为我提供了所需的结果。
var x = [1,2,3];
x.test = 'abc';

for(var i in x){
    console.log(x[i]);
}
//1,2,3,abc

for(var i=0; i<x.length; i++){
   console.log(x[i]);
}
//1,2,3
for(var i=0; i<myarray.length; i++){
    if( myarray[i] !== undefined ){
        console.log( myarray[i] );
    }
}
myarray[i] = undefined;