查看var a=b=1;
,我已经知道a
和b
都具有相同的值。
但我的问题是:
a
的值是1
还是b
?
我做了一个小test:
/*1*/ (function (){
/*2*/ var j = window.j = function (){ alert('3');};
/*3*/ window.j2 = j;
/*4*/ })();
/*5*/
/*6*/ window.j(); //3
/*7*/ window.j=null;
/*8*/ window.j2();//3
正如您所看到的,第8行产生3
所以我认为a
的值不是b
,而是1
的值。
我是对的吗?
可视化:
(function (){
var j = window.j = function (){ alert('3');};
|
| ^ ^
| | | //which one ?
+----------+--------+
})();
答案 0 :(得分:0)
Assigment in JavaScript is right associative,所以你是对的。 在
a = b = c;
a
在分配时获取b
的值,因此如果稍后将b
分配给其他内容,则a
会保留其值(恰好是与c
)
答案 1 :(得分:0)
你在技术上是对的,但我认为与参考/价值分配相混淆。从技术上讲,a
确实从b
获得值,但没有b
的引用,因此如果你要做b = null
它就没有任何影响至a
,这是您在示例中看到的内容。
a
继承b
的值,而不依赖于b
仍然存在或稍后在您引用a
时具有相同的值。赋值从右到左进行,因此实际上会读取a = ( b = 1)
答案 2 :(得分:0)
“=”运算符向右关联,因此“a = b = 1”等同于“a =(b = 1)”。因此,首先将1分配给b,结果为1,然后将其分配给a。
答案 3 :(得分:0)
javascript中的分配从右到左进行。所以你从window.j
获得了价值。重新设置window.j
不会影响结果,因为Javascript变量总是按值传递,异常是数组或对象。
在JS对象中通过ref传递值的示例:
var obj = { x: 2 };
var anotherObj = obj;
anotherObj.x++;
alert(obj.x); //3
您可以找到更多信息here。
this answer中提供了更多有用的示例。