delete操作符详解

让学习“上瘾”,成为更好的自己!!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>delete操作符详解</title>
</head>
<body>
    
    <script>
    /*
    1,代码类型
    在ECMAScript中有3种类型的可执行代码:全局代码、函数代码和Eval代码
    
    2,变量对象:全局对象(window对象) 和 激活对象(函数中的变量对象)
        (1)当进入全局代码的执行上下文(执行环境)时,一个全局对象用作变量对象,在全局范围内声明变量或函数都会成为该变量对象的属性和方法
        (2)在函数代码中,变量对象为激活对象。每次函数代码进入函数的作用域时,就会创建一个激活对象
             函数代码中的变量、函数、形参、arguments对象都会成为该激活对象的属性或者方法

        (3)在Eval代码中声明的变量作为正在调用的上下文的变量对象的属性被创建。Eval代码只是用他正在被调用的那个执行上下文的变量对象
    
    3,属性特性 --> 记住,声明的变量或函数都会成为变量对象的属性或者方法
    每个属性具有以下一个或多个特性:
    (1)ReadOnly
    (2)DontEnum
    (3)DontDelete
    (4)Internal
    */
    // 4,delete操作符使用的具体情况有:【重要!!】
    


    // (1) 声明的变量和函数带有DontDelete特性,未声明赋值变量和函数不具有DontDelete特性
    // var a = 12;
    // delete a;  // false
    // console.log(a);
    // var b = function(){
    //     //  y = 12323;
    //     // delete y;  // true
    //     // console.log(y);
    //     var xx = 323232;
    //     delete xx;  // false
    //     console.log(xx);
    
    // }
    // delete b;  // false
    // console.log(b);

    // b();

    // c = 12;
    // delete c;  // true
    // console.log(c);

    // d = function(){
    //     // do something
    // }
    // delete d;  // true
    // console.log(d);

    // (2) 对象的内置属性(即对象的预定义属性)具有DontDelete特性,比如arguments, length
    // function aa(){
    //     delete arguments;  // false
    //     console.log(arguments);
    // }
    // aa();

    // (3) 与函数参数相对应的创建的属性也具有DontDelete特性
    // var bb = function(a, b){
    //     delete a;  // false
    //     delete b;
    //     console.log(a);
    //     console.log(b);

    // }(1, 2);

    // (4) 明确或者隐含创建的属性不具有DontDelete特性

    // var obj = {};
    // obj.name = 'kai';
    // console.log(obj.name);
    // delete obj.name;  // true
    // console.log(obj.name);

    // (5) DontDelete特性是在属性创建过程中确定的,后来的赋值不会修改现有属性已经存在的特性
        // function foo(){

        // }

        // foo = 1;
        // delete foo;  // false
        // console.log(foo);



    // (6) Eval代码中创建的变量或者方法不具有DontDelete特性,而Eval代码中创建的方法中的变量或方法带有DontDelete特性
        // eval('var x = 12;');
        // console.log(x);
        // delete x;  // true
        // console.log(x);

        // eval('var x = 12;function aa(){var y = 1211;}');

        
    // (7) C++ 的delete删除的是指针所指向的对象,而JavaScript中不会删除指针所指向的对象,而是删除其属性本身

        // var o = {name:'kai'};
        // o.x = new Object(); 
        // delete o.x;  // 上一行new的Object对象依然存在
        // console.log(o.x);  // undefined,o的名为x的属性被删除了
        // delete o.x之后,Object对象会由于失去引用而被垃圾回收,所以delete o.x也就相当于“删除了o.x所指向的对象”,但这个动作并不是ECMAScript的标准



    // (8) “删除属性而不是删除对象”
        // var o = {};
        // var a = {x:10};
        // o.a = a;
        // delete o.a; // o.a属性被删除
        // console.log(o.a);  // undefined
        // console.log(a.x); // 10 --> 因为{x:10}对象依然被a引用,所以不会被回收




    // (9) prototype中声明的属性也具有DontDelete特性
            function C(){
                this.x = 1;
            }
            C.prototype.x = 12;
            C.prototype.y = 132;
            var o = new C();

            console.log(o.x); // 1 --> 构造函数本身定义的o.x

            delete o.x; // false
            console.log(o.x);  // 12 --> prototype中定义的o.x, 即使在执行delete o.x也不会被删除

            delete o.x; // false
            console.log(o.x);  // 12 

            delete C.prototype.x;  // true
            console.log(o.x);  // undefined --> 原型也是一个对象,明确或者隐含创建的属性不具有DontDelete特性

            delete o.y;  // false
             console.log(o.y);  // 132

    
    
    </script>
    
    


</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值