为什么在函数中覆盖整个数组而不是替换它,但是逐个元素覆盖呢?

时间:2015-08-09 23:33:01

标签: 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

2 个答案:

答案 0 :(得分:3)

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

您的函数返回已修改的数组,但您的调用环境会忽略该数组。改变你的考试:

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

答案 1 :(得分:1)

您没有保存结果。

请改为:

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

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

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

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