zoukankan      html  css  js  c++  java
  • 【javascript基础】之【delete 运算符】

    delete 运算符 从对象中删除一个属性,或从数组中删除一个元素。  delete expression  expression 参数是一个有效的 JScript 表达式,通常是一个属性名或数组元素。   说明 如果 expression 的结果是一个对象,且在 expression 中指定的属性存在,而该对象又不允许它被删除,则返回 false。  在所有其他情况下,返回 true。   要求 版本 3   Javascript的变量与delete操作符 版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/以及本声明。   刚刚看到一篇好文(原文链接),对Javascript中的delete操作符分析得很透彻。在这里简单地介绍一下内容。  虽然是一个小小的delete操作符,其行为却异常复杂。  Javascript的变量  delete操作符删除的对象  对变量执行delete的情况  能删除的属性和不能删除的属性  能删除的变量和不能删除的变量  delete的返回值  --------------------------------------------------------------------------------  Javascript的变量 实际上Javascript中,变量 = 对象属性,这是因为 Javascript 在执行脚本之前会创建一个Global对象,所有的全局变量都是这个Global对象的属性,执行函数时也会创建一个Activation对象,所有的局部变量都是这个Activation对象的属性。如下例:  var global = 42; this.global;    // 42, 可以通过this来访问Global对象  this.global2 = 12; global2;        // 12  function foo() {   var local = 36;   // 不过无法直接访问Activation,   // 因此无法通过 foo.local 的方式来访问local变量 }delete操作符删除的对象 C++中也有delete操作符,它删除的是指针所指向的对象。例如:  // C++ class Object { public:   Object *x; }  Object o; o.x = new Object(); delete o.x;     // 上一行new的Object对象将被释放但Javascript的delete与C++不同,它不会删除o.x指向的对象,而是删除o.x属性本身。  // Javascript var o = {}; o.x = new Object(); delete o.x;     // 上一行new的Object对象依然存在 o.x;            // undefined,o的名为x的属性被删除了在实际的Javascript中,delete o.x之后,Object对象会由于失去了引用而被垃圾回收,所以delete o.x也就“相当于”删除了o.x所指向的对象,但这个动作并不是ECMAScript标准,也就是说,即使某个实现完全不删除Object对象,也不算是违反ECMAScript标准。  “删除属性而不是删除对象”这一点,可以通过以下的代码来确认。  var o = {}; var a = { x: 10 }; o.a = a; delete o.a;    // o.a属性被删除 o.a;           // undefined a.x;           // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收另外,delete o.x 也可以写作 delete o["x"],两者效果相同。  对变量执行delete的情况 由于变量也是 Global 或者是 Activation 对象的属性,所以对变量的delete操作也是同样的结果。  var global = 42; delete global;     // 删除Global.global  function foo() {   var local = 36;   delete local;    // 删除Activation.local }能删除的属性和不能删除的属性 并不是所有的属性都能被delete。例如,prototype中声明的属性就无法被delete:  function C() { this.x = 42; } C.prototype.x = 12;  var o = new C(); o.x;     // 42, 构造函数中定义的o.x  delete o.x; o.x;     // 12,  prototype中定义的o.x,即使再次执行delete o.x也不会被删除对象的预定义属性也无法删除。 可以认为这类属性带有DontDelete的特性。  var re = /abc/i; delete re.ignoreCase; re.ignoreCase; // true, ignoreCase无法删除能删除的变量和不能删除的变量 通过var声明的变量和通过function声明的函数拥有DontDelete特性,无法被删除。  var x = 36; delete x; x;     // 36, x没有被删除  y = 12; delete y; y;     // undefined  function foo() { return 42; } delete foo; foo();  // 42但是有一点例外,就是通过 eval 执行的代码中,通过var声明的变量虽然与正常的var声明变量同属于Global对象,但它们不具有DontDelete特性,能被删除。  eval("var x = 36;"); x;     // 42 delete x; x;     // undefined但是这也有一点例外,eval的代码中的函数内通过var定义的变量具有DontDelete,不能被删除。  eval("(function() { var x = 42; delete x; return x; })();"); // 返回 42delete的返回值 delete是普通运算符,会返回true或false。规则为:当被delete的对象的属性存在并且拥有DontDelete时返回false,否则返回true。这里的一个特点就是,对象属性不存在时也返回true,所以返回值并非完全等同于删除成功与否。  function C() { this.x = 42; } C.prototype.y = 12; var o = new C();  delete o.x; // true o.x;        // undefined "x" in o;   // false // o.x存在并且没有DontDelete,返回true  delete o.y; // true o.y;        // 12 // o自身没有o.y属性,所以返回true // 从这里也可以看到prototype链的存在,对象自身属性和prototype属性是不同的  delete o;   // false // Global.o拥有DontDelete特性所以返回false  delete undefinedProperty;  // true // Global没有名为undefinedProperty的属性因此返回true  delete 42;  // true // 42不是属性所以返回true。有的实现会抛出异常(违反ECMAScript标准)  var x = 24; delete x++;  // true x;           // 25 // 被删除的是x++的返回值(24),不是属性,所以返回true
  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    基于分布式锁解决定时任务重复问题
    基于Redis的Setnx实现分布式锁
    基于数据库悲观锁的分布式锁
    使用锁解决电商中的超卖
  • 原文地址:https://www.cnblogs.com/sniper007/p/2223544.html
Copyright © 2011-2022 走看看