当您使用forEach迭代javascript数组时,可以修改对象(下例中的obj),它将改变数组中的原始对象。
但如果删除它,为什么不将它从数组中删除?以下代码根本不会修改数组。
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
myArr.forEach(function(obj) {
delete obj;
});
console.log("after", myArr);
答案 0 :(得分:4)
delete
删除属性,它不会破坏与属性关联的值。
delete obj
只是尝试(并且失败)从当前激活记录中删除本地变量obj
。
失败是因为激活记录虽然是一个对象,却无法以这种方式删除属性。
判断delete
失败的一种方法是查看其返回值,这是一个布尔值,其中true表示在delete
完成后没有这样的属性/绑定:
if (delete obj) {
alert('the obj property was deleted');
} else {
alert('delete did nothing');
}
将它放在(function () { var obj; ... })()
内,它会告诉你它什么也没做。
将它放在with ({ obj: null }) { ... }
内,它会告诉你它有效。
在严格模式下,任何返回false的delete
都应该引发异常,而delete
无效的{{1}}会导致分析时错误。
答案 1 :(得分:2)
您不能以这种方式使用delete
。 delete
用于从对象中删除属性。
您可以使用splice
完成您想要的操作。
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
for (var i = 0, l = myArr.length; i < l; i++) {
myArr.splice(i, 1);
i--; l--;
}
console.log("after", myArr);
答案 2 :(得分:0)
删除会删除属性,对于数组,属性是其值。它适用于这种情况。 Array是一种特殊类型的对象,它还有一个名为length的属性。除非使用splice或任何修改值的数组特定方法,否则Array.length不会更新。
更新:您可以使用以下内容删除值,但数组长度将保持不变
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
myArr.forEach(function(obj) {
delete myArr[myArr.indexOf(obj)];
});
console.log("after", myArr);
交替:
var myArr = [{a:1},{a:2},{a:1}];
for(var i=0;i<myArr.length;i++){
delete myArr[i];
}
console.log(myArr[1]); //undefined
答案 3 :(得分:0)
@Andy是的,你想使用splice
而不是delete
,但是一个小修剪版本就是这样:
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
for (var i = myArr.length; i > 0; i--) {
myArr.splice(i--, myArr[i]);
}
console.log("after", myArr);