2014-02-08 63 views
0

我正在更新文本值,我不確定爲什麼第一個代碼塊不起作用,但是備用塊會這樣。誰可以給我解釋一下這個?它們看起來相當。瞭解獲取和設置nodeValue

//不更新

newAtomicNum = 2; 
oldAtomicNum = document.getElementById("atomicNumber").firstChild.nodeValue; 
oldAtomicNum = newAtomicNum; 

* * //不更新

newAtomicNum = 2; 
oldAtomicNum = document.getElementById("atomicNumber"); 
oldAtomicNum.firstChild.nodeValue = newAtomicNum; 

回答

1

當調用nodeValue沒有設置它,它返回當前的nodeValue,而不是參考財產。

所以看起來像

<div id="atomicNumber">test</div> 

當你調用

var oldAtomicNum = document.getElementById("atomicNumber").firstChild.nodeValue; 

oldAtomicNum元素現在包含字符串test,所以變量設置爲別的東西的nodeValue

不更新的元素
+0

所以我需要創建一個對節點的引用,然後才能設置它? – awpawluczkowycz

0

他們確實非常不同。

在第一個示例中,您要更新的是變量oldAtomicNum。這和document.getElementById("atomicNumber").firstChild.nodeValue之間並沒有持久的聯繫。作業(=)副本,它不創建引用。

注意,這是從這個非常不同:

newAtomicNum = 2; 
atomicNum = document.getElementById("atomicNumber").firstChild; 
atomicNum.nodeValue = newAtomicNum; 

...哪些更新的價值。原因在於,在第二行中,我們複製到atomicNum的值是對象引用。然後我們使用在第三行中引用,分配給對象的一個​​屬性。

+0

所以你必須改變一個對象的值,我需要改變它的引用,而不是現在的值? – awpawluczkowycz

+0

@ user3287384:對象具有*屬性*,它們具有值。你根本不需要變量,你可以這樣做:'document.getElementById(「atomicNumber」)。firstChild.nodeValue = 2;'要記住的關鍵是,當你做一個像'a = b',這是一個*值*被複制。你根本沒有在'a'和'b'之間創建任何鏈接。所以'a = 2; b = a; b = 3;'a'中的'leaves'2',分配給'b'不會改變'a'中的內容。 –

+0

@ user3287384:有時候人們會對對象引用(它們是值)感到困惑,因爲它*看起來像'b'可以影響'a':var a = {foo:2}; b = a; b.foo = 4;的console.log(a.foo); // 4'但請注意,我們**沒有**改變'b'。 'b'仍然具有相同的價值。我們改變的是'b'中的值對象上的一個屬性。 'a' *中的值也是指同一個對象,所以'a.foo'和'b.foo'是同一個屬性。 –