javacript中的引用

来源:互联网 发布:淘宝店铺显示金牌卖家 编辑:程序博客网 时间:2024/06/10 00:07

引用的概念是javascript的基础之一,引用是一个指向对象实际位置的指针。这是一个极为强大的特性。但有一个前提:实际的对象肯定不会是引用。字符串永远是字符串,数组永远是数组。不过多个变量却能够指向同一对象。Javascript基于的就是这样一个引用系统。这门语言通过维护一系列对其他对象的引用,提高了极大的灵活性。

此外,对象可以包含一系列属性,这些属性也都不过是到其他对象(比如字符串、数字、数组等等)的引用。如果多个变量指向的是同一个对象,那该对象的类型一改变,所有这些变量也会跟着相应的改变。如下所示:两个变量都指向同一个对象,而该对象内容的修改对这两个变量都会产生影响。

例子:多个变量引用同一个对象

//obj置为空对象

Var obj=new Object();

//objRef现在是另一个对象的引用

Var objRef=obj

//修改原对象的一个属性

Obj.oneProperty=true;

//我们现在看到,这个改变在两个变量中都反映了出来

//(因为它们引用的是同一个对象)

Alert(obj.oneProperty===objRef.oneProperty)

前文提到,自修改对象在javascript中式很少见的。我们可以来看一个最常出现这种情况的实例:用push()方法来给数组(array)对象添加新元素。因为Array对象实质上是把这些值作为属性保存。多个变量的内容可以同时被修改。

例子:自修改对象的例子

//创建一个数组

Var items=new Array”one”,”tow”,”three”);

//创建数组的一个引用

Var itemsRef=items;

//将一个元素添加到原数组中

Items.push(“four”);

//这两个数组的长度应该是一致的。

//因为他们指向同一个数组对象

Alert(items.length==itemsRef.length);

必须记住的是,引用指向的只能是具体的对象,而不是另一个引用,不像perl语言中允许多层引用。Javascript里的结构式沿着引用链一直上溯到原来的那个对象。如下列所示。一个例子:实际对象已经改变了,但原来指向它的引用仍然保持指向旧的对象。

例子:修改对象的引用,同时保持完整性

//items置为字符串的数组

Var items=new Array(”one”,”tow”,”three”);

//itemsRef置为items的引用

Var itemsRef=items

//items置为一个新对象

Items=new Array”new”,”array”;

//itemsitemsRef现在指向不同的对象了。

//items指向的是Array”new”,”array”;

//itemsRef指向的是Array(”one”,”tow”,”three”);

Alert(items!=itemsRef);

最后,让我们来看一个特殊的例子,看似是自修改对象,其结果却产生了一个新的非引用对象。在执行字符串连接操作时,结果总会是一个新的字符串对象,而非原字符串的修改版本

例子:修改对象而生成新的对象

//item置为一个新的字符串对象

Var item=”test”;

//itemRef现在指向同一个字符串对象

Var itemRef=item;

//将一些新的文本接在这个字符串后面

//注意:这会创建一个新对象,而非修改原对象

Item+=”ing”

//itemitemsRef的值不相等,因为新的字符串对象已被创建

Alert(item!=itemRef)