传递给函数的数组不会变异?

时间:2017-02-07 15:17:57

标签: javascript arrays pass-by-reference

我认为Arrays是对象所以当我执行这行代码时,我期望获得[3,3,3],因为我改变了数组。但是我得到了[2,4,6]

var arr = [2,4,6];

function checkArr(arr){
    arr = [3,3,3];
}

console.log(arr)

如果我添加一个return语句,那么我会得到我期待的值。我想知道为什么在执行函数时给arr一个新值时需要返回。

var arr = [2,4,6];

function checkArr(arr){
    arr = [3,3,3];
  return arr;
}

console.log(arr)

最后,在此for循环期间,我不使用return,并且数组值已更改!我有点困惑。为什么第一个示例没有更改arr的值?

var arr = [2,4,6];

function checkArr(arr){
    for(var i = 0; i<arr.length; i++){
    arr[i] = 3
  }
}

console.log(arr)

1 个答案:

答案 0 :(得分:5)

您未在示例中测试传递引用和传值之间的差异。您实际上正在测试 变量范围

对于有关Javascript按值传递VS传递引用here is an answer on stack already的问题的一个很好的答案。

代码示例行为的说明

在函数内声明(创建)的变量是 local 到该函数。这适用于在函数函数中使用var关键字声明的任何变量。

函数外部声明的变量可以在函数中访问,如果它没有得到相同的名称声明的变量。

示例1:

var arr = [2,4,6]; ------------------
                                     |
function checkArr(arr){              |
// paramter means that a local       |
// variable 'arr' created inside     |
// function, so refers to value      |
// passed as argument or undefined   |
                                     |
  arr = [3,3,3];                     |
}                                    |---- you're loggin this variable, 
                                     |     the one inside the funciton is
var check = checkArr(arr);           |
                                     |     function and eny enclosing child functions
console.log(arr)  <------------------      (for the life of the function)
  

如果我们将参数名称更改为其他名称,行为就会变得更加明显:

var arr = [2,4,6];

function checkArr(ref){
  ref = [3,3,3];
}

checkArr(arr);
     

调用该函数时,会创建并设置本地值ref   参考arr的参考。   接下来的行,然后 将覆盖ref的值   数组文字arr的实际值[3,3,3]

function checkArr(){
  var ref = REFERENCE_TO_ARRAY_PASSED_IN;

  ref = [3,3,3];  // REFERENCE to 'arr' OVERWRITTEN by Array  literal
                  // global 'arr' remains unaffected
}

示例2:

var arr = [2,4,6];

function checkArr(arr){
    arr = [3,3,3];
  return arr;
}

console.log(arr);
// this should log out [2, 4, 6] since you're not even invoking checkArr...

示例3:

var arr = [2,4,6];

function checkArr(arr){
  // same as first example
  // a local variable 'arr' is created
  // from the parameter 'arr'

  // this for loop won't even run
  // if 'arr' isn't passed in as an argument
  // it'll fail on the first condition
  for(var i = 0; i<arr.length; i++){
    arr[i] = 3
  }
}
// the arr variable INSIDE the function is not available here

console.log(arr) // logs out [2, 4, 6]
// this function refers to the variable declared above the function definition, again you haven't even invoked the funciton 'checkArr'
// thought even if you did, it would not change the console.lout ouptput

获取影响全局变量的函数:

从功能定义中删除参数

var arr = [2,4,6];

function checkArr(){
  // no local variable or parameter is defined here
  // but function has access to it's enclosing scope
  // where there IS a variable 'arr'
  arr = [3,3,3]
}

var check = checkArr();

console.log(arr);

// logs out [3,3,3]

现在调用该函数时,您将改变数组,因为该函数将查找变量&#39; arr&#39;在本地,当它没有找到它时,它会查看它的封闭范围,在这种情况下,它是全局范围,它会找到变量arr并将其变异