JavaScript的语言特性 -- 引用
<img src="http://www.everyinch.net/wp-content/uploads/2013/11/reference.jpg" alt="reference" width="517" height="268" class="alignnone size-full wp-image-3484" />引用(reference)的概念是JavaScript的基础之一,“引用”是一个指向对象实际位置的指针。有一个前提:实际的对象肯定不会是引用。多个变量能够指向同一个对象。JavaScript基于的就是这样的一个引用系统,这门语言通过维护一系列对其它对象的引用,提供了极大的灵活性。
此外,对象可以包含一系列属性(property),属性是指向其它对象的引用。通过多个变量指向的是同一个对象,那该对象的类型一改变,所有这些变量也都随之改变。
[code lang="js"]
// 将 obj 置为空对象
var obj = new Object();
// objRef 现在是另一个对象的引用
var objRef = obj;
// 修改原对象的一个属性
obj.oneProperty = true;
// 这个改变在两个变量中都反映了出来
// 因为它们引用的是同一个对象
alert( obj.oneProperty == objRef.oneProperty );
[/code]
自修改(self-modifying)对象在JavaScript中不常见。例如:用 push() 方法来给数组对象添加新的元素,因为Array对象实质上是把这些值作为属性来保存,所以结果和上面的例子差不多,即多个变量的内容可以同时被修改:
[code lang="js"]
// 创建一个数组
var items = new Array( "one", "two", "three" );
// 创建数组的一个引用
var itemsRef = items;
// 将一个元素添加到数组中
items.push( "four" );
// 这两个数组的长度应该是一致的
// 因为它们指向同一个数组对象
alert( items.length == itemsRef.length );
[/code]
引用指向的只能是具体的对象,而不是另一个引用。在JavaScript中是沿着作用域链一直上溯的,下面的例子是:实际对象已经改变了,但原来指向它的引用仍然保持指向旧的对象:
[code lang="js"]
// 将 items 置为字符串的数组
var items = new Array( "one", "two", "three" );
// 将 itemsRef 置为 items 的引用
var itemsRef = items;
// 将 items 置为一个新对象
items = new Array( "new", "array" );
// items 和 itemsRef 现在指向不同的对象了
// items 指向的是 new Array( "new", "array" )
// itemsRef 指向的是 new Array( "one", "two", "three" )
alert( items != itemsRef );
[/code]
需要注意的是:在执行字符串串接操作时,结果是产生一个新的字符串对象,并非是原字符串的修改版本
[code lang="js"]
// 将 item 置为一个心的字符串对象
var item = "test";
// itemRef 现在指向同一个字符串对象
var itemRef = item;
// 将一些新的文本接在这个字符串后面
// 注意:这会创建一个新对象,而不是修改原对象
// the original object.
item += "ing";
// item 和 itemRef 的值不相等了,因为创建了新的字符串对象
alert( item != itemRef );
[/code]
查看完整版本: JavaScript的语言特性 -- 引用
Tags: