zoukankan      html  css  js  c++  java
  • 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 ]
    

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

  • 相关阅读:
    linux 程序安装目录/opt目录和/usr/local目录的区别
    Linux文件目录结构详解
    Jenkins卸载方法(Windows/Linux/MacOS)
    Jmeter案例demo
    idea打包java可执行jar包
    查看端口状态
    轻松掌握mongodb
    sphinx和coreseek
    redis
    redis默认端口6379以其名命名,是我孤陋寡闻了,是名性感美女(梅尔兹)
  • 原文地址:https://www.cnblogs.com/aoximin/p/13195423.html
Copyright © 2011-2022 走看看