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;