仔细一看便知,这里的<code>this</code>指向的是<code>function wxCount()</code>,而在javascript中,<code>delete</code>是无法删除一般的变量或者<code>function</code>的,永远都会返回<code>false</code>。
大多数情况下可以理解为:通过变量或者函数声明的属性不能删除。
<code>x</code>可以理解为全局对象<code>GLOBAL</code>的一个属性,即<code>GLOBAL.x</code>,可以删除成功。函数中的<code>obj</code>也被置为全局属性,同理。
删除数组中元素,数组长度不会发生变化,但是元素实际不存在数组中了。
如果将最后个元素置为undefined,实际还是存在数组中。
关于delete更深的问题和兼容性问题,可以参考
深入理解JS的delete
delete和splice都可以删除数组中的元素,但是有些区别的,我举具体的例子给你看,你看后就明白了。例如有一个数组是 :var textArr = ['a','b','c','d']
这时我想删除这个数组中的b元素:
方法一:delete 删除数组
delete textArr[1] 结果为: [ "a",undefined,"c","d"]
只是被删除的元素变成了 undefined 其他的元素的键值还是不变。
方法二:aplice 删除数组
splice(index,len,[item])注释:该方法会改变原始数组。
index:数组开始下标len: 替换/删除的长度 item:替换的值,删除操作的话 item为空
textArr.splice(1,1) 结果为: [ "a","c","d"] 直接删除了数组 改变了数组的值。
如下图:
变量 b 的原型指向 a ,同时存在同样的键时,使用 delete 删除 b 的这个键(对象和数组同理),再次获取 b 这个键时,会遍历原型链取找这个键,所以就有了新的值而不是 undefined ;
为避免这样导致的错误,可以使用 hasOwnProperty 判断有没有这个键,而不去原型链遍历;
delete 后对象还是会保留键,只是值变成 undefined 了,数组也一样,所以数组 delete 之后如果使用类似 array[array.lenght - 1] 来取值的话,会产生误差,因为 delete 的那个键还在;