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 ]

可以想象一下,其实方式一的效率更高,因为其不用每一次都去创建一个新的数组。

posted @ 2020-06-26 16:39  敖毛毛  阅读(2271)  评论(0编辑  收藏  举报