Javascript多项任务澄清?

时间:2013-09-26 10:27:50

标签: javascript

查看var a=b=1;,我已经知道ab都具有相同的值。

但我的问题是:

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 ?
      +----------+--------+  
})();

4 个答案:

答案 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中提供了更多有用的示例。