2012-03-06 120 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