前言
首先delete 不同于nodejs delete,看下有什么不同。
正文
var test=5;
delete test;
console.log(test);
结果是test没有受到任何影响,依旧可以输出5。
再来一个:
var x={y:{z:5}};
var data=x.y;
console.log(x.y);//输出{z:5}
delete x.y;
console.log(x);//输出{}
console.log(x.y);//输出undef
console.log(data);//输出{z:5}
那么这个时候可以明白其实我们删除的是x与y的联系,y的内存地址其实还在的。
我们知道delete是有返回值的,那么这么来的吧,看下它是否删除成功.
var test=5;
var flag=delete test;
console.log(flag);
这个时候返回为false,那么它是返回不成功的。
那么得出一个疑问,到底什么可以删除什么不可以删除?
问题探索
猜想:
是否只能删除的是它的属性? 而且必须是自定义的属性?
疑问:上面删除test的时候其实是global的一个属性,那么自定义属性不成立。
那么是否是global之外的自定义属性都可以删除呢?
var arr = [1,3,4,6,73,2];
delete arr[2];
console.log(arr.length); // 6
console.log(arr[2]); //undefiend consoel.log(arr);
//[ 1, 3, , 6, 73, 2 ]
那么可以看到其实删除的真的是内存引用,还是讲指针指向了undefind?
经过前面的案例,其实是将指针指向了undefind,也就是未初始化状态。
这里我们可以看到其实delete对元组和object处理方式是不同的,那么我们
不能当做单一的来处理这一系列问题。
提出疑问:
到底delete 对象的属性的时候是否让该属性置空了还是删除了呢?
看个荔枝:
var test={
k:5
}
var testx=test;
delete test.k;
console.log(test);//{}
console.log(testx);//{}
看见其被删除了,而不是置空了。
再来看下隐式全局变量和显示全局变量:
x=6;
var y=7;
delete x;
delete y;
console.log(y);//7
console.log(x);//undefine
可以删除隐式的声明,不能删除显示的声明。
那么最后看下别人的删除数组的例子:
方式一:
var arr = [1,3,5,21,3,4,53,21,5,2];
arr.forEach(function(val,index){ if(val < 10){ delete arr[index]; } }) console.log(arr); //[ , , , 21, , , 53, 21, , ] //可以使用filter过滤掉空值 [ 21, 53, 21 ];
arr = arr.filter(function(val){return val});
方式二:
for(var i=0;i<arr.length;i++){
if(arr[i] < 10){
arr.splice(i,1);
i--;
}
})
console.log(arr);// [ 3, 21, 4, 53, 21, 2 ]
可以想象一下,其实方式一的效率更高,因为其不用每一次都去创建一个新的数组。