2012-03-06 129 views
0

我有關於問題,爲什麼下面的返回值不一致對象屬性重命名

(function(ab, $, undefined) { 

    ​ab.cool = { 
     nice: { 
      funky: { 
       sweet: false 
      }  
     } 
    }; 

    var reVal = ab.cool.nice.funky.sweet; 
    reVal = true; 

    console.log(reVal); //equals true 
    console.log(ab.cool.nice.funky.sweet); //equals false 

}(window.ab = window.ab || {}, jQuery));​ 

我本來認爲兩者都應該返回相同的值true

有人可以解釋爲什麼會發生這種情況嗎?他們被認爲是不同的屬性?

回答

0

發生了什麼事是,ab.cool.nice.funky.sweet值被複制到reVal。如果您試圖將ab.cool.nice.funky複製到reVal,則不會發生這種情況,因爲兩個符號都會引用同一個對象。

這種差異是處理值類型的產物,如布爾值或整數,與javascript中基本上意指對象的引用類型不同。

檢查本作的詳細信息:http://docstore.mik.ua/orelly/webprog/jscript/ch11_02.htm

+0

感謝您的解釋。所以最好使用'var reVal = ab.cool.nice.funky;'然後使用'reVal.sweet = false;'? – Andy 2012-03-06 15:33:44

+0

如果你想能夠從兩個符號中控制相同的值,是的,這是一個解決方案。 – 2012-03-06 15:34:56

+0

一般來說,最佳做法是儘量減少對同一對象的引用,以避免混淆並提高可讀性。所以如果你確實有一個對象的引用,除非你絕對需要它,否則你不應該創建另一個引用。如果您需要訪問閉包之外的值,請將其暴露在閉包之上,不要複製其參考。 – 2012-03-06 15:40:44

3

您不重命名該變量,您將值分配給另一個。

它像:

$foo = $bar = true; 
$bar = false; 

print $foo; // true 
print $bar; // false 
+0

得到它:) brainfart - 遺憾的臭味,但感謝您的幫助。 – Andy 2012-03-06 15:30:04