先看一段代码


var a = ['a', 'b'];
console.log(a);
//["a", "b"]
delete(a[0]);
console.log(a);
//[undefined,"b"]

var o = {a:'a', b:'b'};
console.log(o);
//Object { a="a", b="b"}
delete(o.a);
console.log(o);
//Object { b="b"}

由此可见:

delete运算符把一个数组元素设置为undefined值,但元素本身还继续存在。要真正删除一个元素,以使下标位置高于它的所有元素都向下迁移到较低的下标位置,那么必须使用一个数组方法。Array.shift()方法删除掉数组的第一个元素,Array.pop()方法删除掉最后一个元素,Array.splice()从一个数组删除一个连续范围内的元素。

而当delete运算符作用于对象时,删除属性不仅仅是把属性设置为undefined,而是从对象移除了属性。在删除之后,for/in将不会枚举该属性,并且in运算符也不会检测到该属性。