javascript - 为什么在函数中覆盖整个数组不会替换它,但逐个元素覆盖却可以?

标签 javascript arrays

我正在学习 JavaScript。其中一个练习是编写一个函数,覆盖作为参数传入的数组中的值。我的解决方案在函数内有效,但它似乎没有从函数传回。另外,如果我做不在函数中的同样的事情,它也会起作用。在弄清楚问题所在之后,我编写了解决方案的简化版本和有效版本。但我还是不明白为什么一个有效,一个无效。有人可以解释一下吗?

谢谢

function reverseArrayInPlace(ary){                                
  // This version is successful                                   
  ary[0] = 5;                                                     
  ary[1] = 4;                                                     
  ary[2] = 3;                                                     
  ary[3] = 2;                                                     
  ary[4] = 1;                                                     
  console.log("Within reverseArrayInPlace: " + ary);              
  return ary;                                                     
  }                                                               

function reverseArrayInPlace2(ary){                               
  // This version is not successful                               
  ary = [5, 4, 3, 2, 1];                                          
  console.log("Within reverseArrayInPlace2: " + ary);             
  return ary;                                                     
}                                                                 

var arrayValue = [1, 2, 3, 4, 5];                                 
reverseArrayInPlace(arrayValue);                                  
console.log("After reverseArrayInPlace: " + arrayValue);          

var arrayValue2 = [1, 2, 3, 4, 5];                                
reverseArrayInPlace2(arrayValue2);                                
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);

// But this works.
arrayValue2 = [5, 4, 3, 2, 1];                                    
console.log("After outer replace of arrayValue2: " + arrayValue2);

结果:

在reverseArrayInPlace内:5,4,3,2,1

reverseArrayInPlace 之后:5,4,3,2,1

在reverseArrayInPlace2内:5,4,3,2,1

reverseArrayInPlace2之后 - 为什么顺序错误?:1,2,3,4,5

外部替换 arrayValue2 后:5,4,3,2,1

最佳答案

JavaScript 是一种按值传递(或按值调用,如果您愿意的话)语言。在函数内部为函数参数分配新值对外界没有影响。但是,使用对对象的传入引用来修改属性值确实会影响外部世界。您传入对数组的引用,然后该函数可以使用该引用将新值填充到数组的元素中。

您的函数返回修改后的数组,但您的调用环境会忽略它。更改您的测试:

var arrayValue2 = [1, 2, 3, 4, 5];                                
arrayValue2 = reverseArrayInPlace2(arrayValue2);                                
console.log("After reverseArrayInPlace2 - why is order wrong?: " + arrayValue2);

关于javascript - 为什么在函数中覆盖整个数组不会替换它,但逐个元素覆盖却可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909838/

相关文章:

java - 如何在ajax中发送多部分请求?

javascript - 使用 moment js 创建一个包含星期几和一天中几小时的数组?

c++ - 自定义类的C++数组,没有匹配的函数调用

arrays - mongoDB - 如何在数组内的对象中更新/插入字段?

javascript - 将变量传递到新打开的窗口 - nwj (node-webkit)

javascript - 是否可以使用 PHP 表单传递 html 元素属性?

javascript - 简单的正则表达式Excel提取

javascript - 遍历多个数组,组合成单个数组,在子数组内维护索引

Java .contains 方法

java - Java中金字塔数组函数显示数字时出错