代码改变世界

JavaScript delete操作符学习总结

2010-11-02 09:27  毛狮子  阅读(288)  评论(0编辑  收藏  举报

  在JS中用delete操作符通常用来删除对像的属性[注:delete删除的不是对像属性指向的对像,而是删除对像属性本身。断开它与指向对像的引用连接]

 

var obj={a:[1,2,3,4],b:200};
var c=obj.a;
delete obj.a;
alert(obj.a)//undefined
alert(c);//1,2,3,4

  用delete删除对像的一个属性后,对像属性由于失去了引用而被垃圾回收器回收,所以用delete对像属性,也就相当于删除属性所引用的对像[这个引用不像不被其他变量引用情况下]


浏览:《深入详解JavaScript之delete操作符》来了解delete更详细的说明


"在源码中声明的变量和方法实际上都是作为属性被加入到与当前上下文相关联的这个对像当中"

Js在执行脚本之前创建一个全局对像,所有全局变量都是这个全局对像的属性,执行函数时也会创建一个活动对像,所有的局部变量都是这个活动对像的属性

"在eval代码段中定义的变量都是被加入到当前val的上下文环境对像中,也就是说进入eval代码时并不会新建新的变量对像,而是沿用当前的环境."

//全局下
var GLOBAL    =    this;//window
var var1=    [1,2,3,4];
alert(var1  ===    GLOBAL.var1); //true 
eval("var var2='jiangsk540';");
alert(GLOBAL.var2);//jiangsk540
alert(GLOBAL.var2===var2);//true
//局部
function func(param1,param2){
    var v1    =    2;
    function f1(){}
    eval("var v2=123;");
    alert(v2);//123
    /*
        把局部中的活动对像作为一个抽像的存在。实际是不能访问这个对像的
        参数列表对像
        活动对像.arguments===arguments; //true
        参数
        活动对像.param1    ===param1;//true
        活动对像.param2    ===param2;//true
        局部变量
        活动对像.v1    === v1;//true
        活动对像.f1    === f1;//true
        活动对像.v2    ===v2//true
    */
}

不能删除的属性

当一个属性或变量它存在DontDelete这个标识时。这个属性或变量不能被delete删除[不能通过代码来判断一个对像或变量是否存在DontDelete这个标识]

并不是所有的属性都能被delete删除.例如,实例对像继承于prototype上的属性不能被删除,JS的内置对像的属性也无法删除,这些属性都带有DontDelete的特性

 

function C(p1,p2){
}
//不能通过实例对像来删除原型上的属性
C.prototype.x=12;
var o=new C();
alert(o.x);//12
delete o.x;
alert(o.x);//12
//不能删除对像的内置属性
alert(C.length);//2
delete C.length;
alert(C.length);//2

 

能删除的变量和不能删除的变量

通过var声明变量和通过function声明的函数拥有DontDelete特性,无法被删除,eval的代码中的函数内通过var定义的变量也具有DontDelete,但是,通过eval执行的代码中,通过var声明的变量或函数不带有DontDelete特性,因此这些变量能被delete删除,非声明性赋值语句会产生全局变量,进而变成全局对像的属性。所以非声明性赋值语句产生的对像是可以被delete删除的

 

//全局
var v1=1;
delete v1;//false
alert(v1);//alert(1);
v2    =    "jiangsk540";
delete v2;//true
alert(v2);//undefined;
eval("var v3='MSZ';");
delete v3;//true
alert(v3);//undefined
//局部
(function(){
    var fv1=1;
    delete fv1;//false
    alert(fv1);//1
    eval("var fv2='毛狮子'");
    delete fv2;//true
    alert(fv2);//undefined
})()

 

delete操作符返回true或false。

"规则为:当被delete的对像的属性存在并拥有DontDelete时 返回false,否则返回true。这里一个特点就是,对像属性不存在是也返回true,所以返回并非完全等同于删除成功与否"