js es6 delete


前言

首先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 ]

可以想象一下,其實方式一的效率更高,因為其不用每一次都去創建一個新的數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM