Javascript 为什么赢了';我的函数不能改变对象值吗?

Javascript 为什么赢了';我的函数不能改变对象值吗?,javascript,Javascript,为什么add()函数对列表没有影响?我想创造的是: 函数数组列表(数组){ 列表={}; 函数添加(列表、索引){ if(索引

为什么
add()
函数对列表没有影响?我想创造的是:

函数数组列表(数组){
列表={};
函数添加(列表、索引){
if(索引<数组长度){
list={value:array[index],rest:null};
添加(list.rest,索引+1);
}
}
添加(列表,0);
退货清单;
}

您的代码编写时就好像JavaScript是一种按引用传递的语言一样。事实并非如此

具体地说,在
add()
函数中,编写代码时,似乎对参数
列表进行赋值将对作为参数传递到函数中的内容产生影响;不会的。也就是说,这句话:

        list = {value:array[index], rest : null};
将修改参数的值,但不会影响全局变量
列表

有不同的方法可以重新设计代码。这里有一个方法:

function arrayToList(array){
    function add(index){
        var entry = null;
        if (index < array.length) {
            entry = { value: array[index], rest: add(index + 1) };
        }
        return entry;
    }
    return add(0);
}
函数数组列表(数组){
函数添加(索引){
var条目=null;
if(索引<数组长度){
entry={value:array[index],rest:add(index+1)};
}
返回条目;
}
返回add(0);
}

您的代码编写时就好像JavaScript是一种按引用传递的语言一样。事实并非如此

具体地说,在
add()
函数中,编写代码时,似乎对参数
列表进行赋值将对作为参数传递到函数中的内容产生影响;不会的。也就是说,这句话:

        list = {value:array[index], rest : null};
将修改参数的值,但不会影响全局变量
列表

有不同的方法可以重新设计代码。这里有一个方法:

function arrayToList(array){
    function add(index){
        var entry = null;
        if (index < array.length) {
            entry = { value: array[index], rest: add(index + 1) };
        }
        return entry;
    }
    return add(0);
}
函数数组列表(数组){
函数添加(索引){
var条目=null;
if(索引<数组长度){
entry={value:array[index],rest:add(index+1)};
}
返回条目;
}
返回add(0);
}

首先,您需要在
列表
前面打上一个
var
,这样您就不会创建全局变量

function arrayToList(array) {
  var LIST = {};
  ...
}
接下来的问题是,当您传入
list.rest
时,您没有传递对该属性的引用。您只是在传递
null
的值。相反,您可能希望尝试在末尾创建一个节点,但将该值设置为
null

function arrayToList(array) {
  var LIST = {};
  function add(list, index) {
    if (index < array.length) {
      list.value = array[index];
      list.rest = {};
      add(list.rest, index + 1);
    } else {
      list.rest = list.value = null;
    }
  }
  add(LIST, 0);
  return LIST;
}

首先,您需要在
列表
前面加上一个
var
,这样就不会创建全局变量

function arrayToList(array) {
  var LIST = {};
  ...
}
接下来的问题是,当您传入
list.rest
时,您没有传递对该属性的引用。您只是在传递
null
的值。相反,您可能希望尝试在末尾创建一个节点,但将该值设置为
null

function arrayToList(array) {
  var LIST = {};
  function add(list, index) {
    if (index < array.length) {
      list.value = array[index];
      list.rest = {};
      add(list.rest, index + 1);
    } else {
      list.rest = list.value = null;
    }
  }
  add(LIST, 0);
  return LIST;
}

在add中,您可以访问列表变量本身,因为add是一个私有方法。在add中,您可以访问列表变量本身,因为add是一个私有方法。那应该行。既然我不能通过引用传递对象,这是否意味着没有办法绕过它?我尝试了另一种方法,用for循环代替add()函数来做同样的事情,但我尝试用递归来做。@shauryagupta我已经用一个递归的替代方法更新了答案,这个方法应该可以工作。既然我不能通过引用来传递对象,这是否意味着没有办法绕过它?我尝试了另一种方法,用for循环代替add()函数来做同样的事情,但我尝试用递归来做。@shauryagupta我已经用一个递归的替代方法更新了答案,这个方法应该可以工作。