前言
首先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 ]
可以想象一下,其實方式一的效率更高,因為其不用每一次都去創建一個新的數組。