Javascript 在分配给循环中的变量之前对右侧表达式的求值

Javascript 在分配给循环中的变量之前对右侧表达式的求值,javascript,arrays,list,Javascript,Arrays,List,我很难理解这个问题的答案: 对于以下函数,从数组创建一个列表 function arrayToList(array) { var list = null; for (var i = array.length-1; i>=0; i--) { list = {value: array[i], rest: list}; } return list; } 我的问题是:为什么现有列表没有被新列表覆盖,而是将新列表替换为rest属性 在对所选答案的评论中,解释如下: 因

我很难理解这个问题的答案:

对于以下函数,从数组创建一个列表

function arrayToList(array) 
{
  var list = null;
  for (var i = array.length-1; i>=0; i--) {
      list = {value: array[i], rest: list};
  }
  return list;
}
我的问题是:为什么现有列表没有被新列表覆盖,而是将新列表替换为rest属性

在对所选答案的评论中,解释如下:

因为赋值的整个右侧表达式是 在实际分配给左手之前进行评估/执行 边变量。因此,在构造新对象时,旧对象 一个是未触及的,因此它的价值可以在这期间使用 建设就像VarA=1;a=1+a;a在这之后是2, 其值在计算右侧后才会更改。 列表是一样的,我们不是在编辑列表,而是在改变它的内容 是对的参考。也就是说,它引用了{value:3,rest:null} 现在它是对一个新对象的引用{value:2,rest:{value:3,rest: 空}}

我无法理解这个答案,这意味着在构建新对象时,旧对象未被触及,因此在构建过程中可以使用它的价值

这个循环是如何像一个递归的,而不是不断重写列表的

为什么现有列表没有被新列表覆盖 而是将新列表替换为rest属性

列表对象被覆盖,但是,由于上述原因,在重新分配之前,先前的值存储在rest中

在构造新对象时,旧对象未被触及 所以它的价值可以在这个过程中使用

为便于理解,上述行可解释如下

var temp = {value: array[i], rest: list};
list = temp;
如您所见,首先将list的上一个值存储在对象的其余部分,然后将list重新分配给该对象

为什么新列表不会覆盖现有列表,而是将新列表替换为rest属性

这是因为运算符和求值的优先级,因此必须解析第一个{value:array[i],rest:list};,这意味着创建对象,存储值,然后将其分配到列表变量中

这种情况的一个例子如下:

//决议5*4 //解决20+测试 //解析c=20检验; //解析b=c; //解析a=b; 变量a=b=c=5*4+试验; console.loga; console.logb;
console.logc;在每个循环周期中,为列表标识符指定一个值。因此,返回的列表是在上一个循环中分配的。但在循环中,您再次使用列表,位于等号右侧。在这里,您使用的标识符的值恰好是上一个循环周期中的对象,或者在第一个循环周期中为null。那么您的问题是,为什么现有列表没有被新列表覆盖,而新列表被替换为rest属性?它的前提是错误的。新列表不会替换到rest属性中。它正是放置在该属性中的旧列表。新列表是分配给列表标识符的新值,在下一个循环周期中,列表标识符将成为旧列表,并被放入rest属性中。
var temp = {value: array[i], rest: list};
list = temp;