引用
JavaScript的一個(gè)重要的方面是引用的概念。引用就是指向?qū)ο髮?shí)際位置的指針。這是一項(xiàng)極其強(qiáng)大的功能。前提是,實(shí)際的對象決不是一個(gè)引用:字符串總是一個(gè)字符串,數(shù)組總是一個(gè)數(shù)組。然而,多個(gè)變量可以引用相同的對象。JavaScript就是以這種引用引用機(jī)制為基礎(chǔ)。通過維護(hù)一系列的指向其它對象的引用,語言為你提供了更大的彈性。 另外,對象能包括一系列的屬性,這些屬性簡單地引用其它對象(如字符串,數(shù)字,數(shù)組等等)。當(dāng)幾個(gè)變量指向相同對象時(shí),修改底層對象類型將會在所有的指點(diǎn)向它的變量上有所反映。例2-1即此一例,兩個(gè)變量指向同一個(gè)對象,但是對對象內(nèi)容的修改的反映是全局的。
程序2-1. 多變量引用單個(gè)對象的示例
//設(shè)置obj為一個(gè)空對象 var obj = new Object();
//objRef現(xiàn)在引用了別的對象 var objRef = obj;
//修改原始對象的屬性 obj.oneProperty = true;
//我們可以發(fā)現(xiàn)該變化在兩個(gè)變量中都可以看到 //(因?yàn)樗麄円昧送粋(gè)對象) alert( obj.oneProperty === objRef.oneProperty );
我從前提到過自更改的對象在JavaScript里非常少見的。讓我們看一個(gè)發(fā)生這一狀況的實(shí)例。數(shù)組對象能夠用push方法給它自己增加額外的項(xiàng)。因?yàn)樵跀?shù)組對象的核心,值是作為對象的屬性存儲的,結(jié)果類似程序2-1中的情形,一個(gè)對象成為全局被改動(dòng)的(導(dǎo)致了多個(gè)變量的值被同時(shí)改變)。見程序2-2.
程序2-2. 自修改對象的例子
//創(chuàng)建一組項(xiàng)目的數(shù)組 var items = new Array( "one", "two", "three" );
//創(chuàng)建一個(gè)對項(xiàng)目數(shù)組的引用 var itemsRef = items;
//給原始數(shù)組添加一項(xiàng) items.push( "four" );
//兩個(gè)數(shù)組的長度應(yīng)該相同, //因?yàn)樗鼈兌贾赶蛳嗤臄?shù)組對象 alert( items.length == itemsRef.length );
記住這一點(diǎn)是很重要的:引用總是只指向最終被引用的對象,而不會是引用本身。例如,在Perl語言里,很可能有一個(gè)引用指向另一個(gè)也是引用的變量。但在JavaScript里,它會沿著引用鏈向下追溯直到指向核心的對象。程序2-3演示了這種情形,物理的目標(biāo)已經(jīng)改變而引用仍然指向原來的對象。
程序2-3. Changing the Reference of an Object While Maintaining Integrity(見#9 oerrite 的回復(fù))
// 設(shè)置items為一個(gè)字符串的數(shù)組(對象) var items = new Array( "one", "two", "three" );
// 設(shè)置itemsRef為對items的引用 var itemsRef = items;
//讓items指向一個(gè)新的對象 items = new Array( "new", "array" );
// items和itemsRef現(xiàn)在指向不同的對象 // items指向new Array( "new", "array" ) // itemsRef則指向new Array( "one", "two", "three" ) alert( items !== itemsRef );
最后,讓我們來看一個(gè)陌生的例子,表面似乎是一個(gè)自修改的對象,卻作用于一個(gè)新的未被引用的對象。當(dāng)執(zhí)行字符串串聯(lián)時(shí),結(jié)果總是一個(gè)新的字符串對象,而非原字符串更改后的版本。這在程序2-4中可以看出。
程序2-4. 對象修改作用于一個(gè)新的對象而非自修改對象的示例
//讓item等于一個(gè)新的字符串對象 var item = "test";
//itemRef也引用相同的字符串對象 var itemRef = item;
//在字符串對象上串聯(lián)一個(gè)新的對象 //注意:這創(chuàng)建了一個(gè)新的對象,并不修改初始對象 item += "ing";
//item和itemRef的值并不相等,因?yàn)?br>//一個(gè)全新的對象被創(chuàng)建了 alert( item != itemRef );
如果你剛剛接觸,引用可能是個(gè)令人頭大的刁鉆話題。然而,理解引用是如何工作的對于編寫良好、干凈的JavaScript代碼是極其重要的。接下來的幾節(jié)我們將探究幾種未必新鮮和令人激動(dòng)的,但是同樣對編寫良好、干凈的代碼很重要的特性。
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁 摘要 下一頁 語言特性:函數(shù)重載和類型檢查
◎進(jìn)入論壇網(wǎng)頁制作、網(wǎng)站綜合版塊參加討論
|