[转]Javascript的变量与delete操作符

news/2024/7/7 11:11:06 标签: delete, javascript, object, prototype, function, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">
class="cnt">

Javascript的变量

实际上Javascript中࿰c;变量 = 对象属性࿰c;这是因为 Javascript 在执行脚本之前会创建一个Global对象࿰c;所有的全局变量都是这个Global对象的属性࿰c;执行函数时也会创建一个Activation对象࿰c;所有的局部变量都是这个Activation对象的属性。如下例:

var global = 42;
this.global;    // 42, 可以通过this来访问Global对象

this.global2 = 12;
global2;        // 12

class="tags" href="/tags/FUNCTION.html" title=function>function foo() {
  var local = 36;
  // 不过无法直接访问Activation࿰c;
  // 因此无法通过 foo.local 的方式来访问local变量
}

class="tags" href="/tags/DELETE.html" title=delete>delete操作符删除的对象

C++中也有class="tags" href="/tags/DELETE.html" title=delete>delete操作符࿰c;它删除的是指针所指向的对象。例如:

// C++
class Object {
public:
  Object *x;
}

Object o;
o.x = new Object();
class="tags" href="/tags/DELETE.html" title=delete>delete o.x;     // 上一行new的Object对象将被释放

但Javascript的class="tags" href="/tags/DELETE.html" title=delete>delete与C++不同࿰c;它不会删除o.x指向的对象࿰c;而是删除o.x属性本身

// Javascript
var o = {};
o.x = new Object();
class="tags" href="/tags/DELETE.html" title=delete>delete o.x;     // 上一行new的Object对象依然存在
o.x;            // undefined࿰c;o的名为x的属性被删除了

在实际的Javascript中࿰c;class="tags" href="/tags/DELETE.html" title=delete>delete o.x之后࿰c;Object对象会由于失去了引用而被垃圾回收࿰c;所以class="tags" href="/tags/DELETE.html" title=delete>delete o.x也就“相当于”删除了o.x所指向的对象࿰c;但这个动作并不是ECMAScript标准࿰c;也就是说࿰c;即使某个实现完全不删除Object对象࿰c;也不算是违反ECMAScript标准。

“删除属性而不是删除对象”这一点࿰c;可以通过以下的代码来确认。

var o = {};
var a = { x: 10 };
o.a = a;
class="tags" href="/tags/DELETE.html" title=delete>delete o.a;    // o.a属性被删除
o.a;           // undefined
a.x;           // 10, 因为{ x: 10 } 对象依然被 a 引用࿰c;所以不会被回收

另外࿰c;class="tags" href="/tags/DELETE.html" title=delete>delete o.x 也可以写作 class="tags" href="/tags/DELETE.html" title=delete>delete o["x"]࿰c;两者效果相同。

对变量执行class="tags" href="/tags/DELETE.html" title=delete>delete的情况

由于变量也是 Global 或者是 Activation 对象的属性࿰c;所以对变量的class="tags" href="/tags/DELETE.html" title=delete>delete操作也是同样的结果。

var global = 42;
class="tags" href="/tags/DELETE.html" title=delete>delete global;     // 删除Global.global

class="tags" href="/tags/FUNCTION.html" title=function>function foo() {
  var local = 36;
  class="tags" href="/tags/DELETE.html" title=delete>delete local;    // 删除Activation.local
}

能删除的属性和不能删除的属性

并不是所有的属性都能被class="tags" href="/tags/DELETE.html" title=delete>delete。例如࿰c;class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype中声明的属性就无法被class="tags" href="/tags/DELETE.html" title=delete>delete:

class="tags" href="/tags/FUNCTION.html" title=function>function C() { this.x = 42; }
C.class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype.x = 12;

var o = new C();
o.x;     // 42, 构造函数中定义的o.x

class="tags" href="/tags/DELETE.html" title=delete>delete o.x;
o.x;     // 12,  class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype中定义的o.x࿰c;即使再次执行class="tags" href="/tags/DELETE.html" title=delete>delete o.x也不会被删除

对象的预定义属性也无法删除。 可以认为这类属性带有DontDelete的特性。

var re = /abc/i;
class="tags" href="/tags/DELETE.html" title=delete>delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase无法删除

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

通过var声明的变量和通过class="tags" href="/tags/FUNCTION.html" title=function>function声明的函数拥有DontDelete特性࿰c;无法被删除。

var x = 36;
class="tags" href="/tags/DELETE.html" title=delete>delete x;
x;     // 36, x没有被删除

y = 12;
class="tags" href="/tags/DELETE.html" title=delete>delete y;
y;     // undefined

class="tags" href="/tags/FUNCTION.html" title=function>function foo() { return 42; }
class="tags" href="/tags/DELETE.html" title=delete>delete foo;
foo();  // 42

但是有一点例外࿰c;就是通过 eval 执行的代码中࿰c;通过var声明的变量虽然与正常的var声明变量同属于Global对象࿰c;但它们不具有DontDelete特性࿰c;能被删除。

eval("var x = 36;");
x;     // 42
class="tags" href="/tags/DELETE.html" title=delete>delete x;
x;     // undefined

但是这也有一点例外࿰c;eval的代码中的函数内通过var定义的变量具有DontDelete࿰c;不能被删除。

eval("(class="tags" href="/tags/FUNCTION.html" title=function>function() { var x = 42; class="tags" href="/tags/DELETE.html" title=delete>delete x; return x; })();");
// 返回 42

class="tags" href="/tags/DELETE.html" title=delete>delete的返回值

class="tags" href="/tags/DELETE.html" title=delete>delete是普通运算符࿰c;会返回true或false。规则为:当被class="tags" href="/tags/DELETE.html" title=delete>delete的对象的属性存在并且拥有DontDelete时返回false࿰c;否则返回true。这里的一个特点就是࿰c;对象属性不存在时也返回true࿰c;所以返回值并非完全等同于删除成功与否。

class="tags" href="/tags/FUNCTION.html" title=function>function C() { this.x = 42; }
C.class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype.y = 12;
var o = new C();

class="tags" href="/tags/DELETE.html" title=delete>delete o.x; // true
o.x;        // undefined
"x" in o;   // false
// o.x存在并且没有DontDelete࿰c;返回true

class="tags" href="/tags/DELETE.html" title=delete>delete o.y; // true
o.y;        // 12
// o自身没有o.y属性࿰c;所以返回true
// 从这里也可以看到class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype链的存在࿰c;对象自身属性和class="tags" href="/tags/PROTOTYPE.html" title=prototype>prototype属性是不同的

class="tags" href="/tags/DELETE.html" title=delete>delete o;   // false
// Global.o拥有DontDelete特性所以返回false

class="tags" href="/tags/DELETE.html" title=delete>delete undefinedProperty;  // true
// Global没有名为undefinedProperty的属性因此返回true

class="tags" href="/tags/DELETE.html" title=delete>delete 42;  // true
// 42不是属性所以返回true。有的实现会抛出异常(违反ECMAScript标准)

var x = 24;
class="tags" href="/tags/DELETE.html" title=delete>delete x++;  // true
x;           // 25
// 被删除的是x++的返回值(24)࿰c;不是属性࿰c;所以返回true
 
原文:http://tech.idv2.com/2008/01/09/class="tags" href="/tags/JAVASCRIPT.html" title=javascript>javascript-variables-and-class="tags" href="/tags/DELETE.html" title=delete>delete-operator/
cle>

http://www.niftyadmin.cn/n/1737966.html

相关文章

使用 GNU profiler 来提高代码运行速度

原文链接:http://www.ibm.com/developerworks/cn/linux/l-gnuprof.html 使用 GNU profiler 来提高代码运行速度寻找应用程序中占用时间最长的部分 Martyn Honeyford (martynhuk.ibm.com), 软件工程师, IBM UK Labs 2006 年 5 月 08 日 改进应用程序的性能是一项非常耗时…

tensorflow2.0在call()方法中使用tf.reshape()方法报错

记录一下自己在tensorflow2.x的call()方法中,打算改变张量的形状,所以使用了: x tf.reshape(x,(batch_size,-1)) 这样的代码,发生报错。 原因是在构建动态图的时候tensorflow2.0内部还没有创建具体的变…

What is ESI?

The ESI(Edge Side Includes) language is conceptually similar in many ways to the Server Side Includes (SSI) function found in many web servers. It is an in-markup scripting language that is interpreted before the page is served to the client.

tf.saved_model.load()出错

有时我们保存tensorflow2.x模型时,采用了tensorflow的统一模型保存格式, tf.saved_model.save(model, "保存的目标文件夹名称") 当我们通过 model tf.saved_model.load("保存的目标文件夹名称") 加载该模型时,调用出…

HTML的color

The attribute value type "color" (%Color;) refers to color definitions as specified in [SRGB]. (颜色的定义) A color value may either be a hexadecimal number (prefixed by a hash mark-#) or one of the following sixteen col…

AI算法岗面试问题记录1

记录一下面试算法岗过程中问到的问题,部分想不起了。 1.交叉熵是怎么回事?公式是什么? 在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即 由于KL散度中的前一部分−H(y)不变&…

Python类专有方法

Python除了自定义私有变量和方法外,还可以定义专有方法。专有方法是在特殊情况下或使用特殊语法时由python调用的,而不是像普通方法一样在代码中直接调用。看到形如__XXX__的变量或函数名时就需要注意下,这在python中是有特殊用途的 __init_…

【转】html元素的ID和name的区别

可以说几乎每个做过Web开发的人都问过,到底元素的ID和Name有什么区别阿?为什么有了ID还要有Name呢?!而同样我们也可以得到最classical的答案:ID就像是一个人的身份证号码,而Name就像是他的名字,ID显然是唯一的&#x…