修改传递给它的函数中的数组

时间:2017-06-19 03:17:05

标签: javascript



function nextInLine(arr, item) {
  arr.push(item);
  var removedItem = arr.shift();
  return removedItem;
}

// Test Setup
var testArr = [1,2,3,4,5];

// Display Code
console.log("Before: " + JSON.stringify(testArr));
console.log(nextInLine(testArr, 6));
console.log("After: " + JSON.stringify(testArr)); //*THIS LINE HERE*




在上面的代码段中,为什么第3 console.log行按照我的逻辑打印[2,3,4,5,6] ..当testArr传递给nextInLine时,只传递testArr的副本作为参数。因此,第3 console.log行必须按原样打印[1,2,3,4,5],不做任何更改!

感谢任何帮助。谢谢。

4 个答案:

答案 0 :(得分:1)

在Javascript中

通过引用传递对象。数组只是一个对象。

因此,当您将数组传递给函数时,它实际上是将引用传递给外部数组,然后进行修改

$file = 'https://www.somesite.com/conversion.jpg?id=blahblah&name='.$xmlval['fname'].'&city='.$xmlval['city'].'&state='.$xmlval['regionDisplay'].'&email='.$xmlval['email'].'&message='.($xmlval['rebill'] == 'true' ? 'Renewed ' : 'Purchased ').$spc_licenses.($spc_licenses == 1 ? ' license ' : ' licenses ').' of product!';

if (function_exists('curl_version')) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $file);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $content = curl_exec($curl);
    curl_close($curl);
}
else if (file_get_contents(__FILE__) && ini_get('allow_url_fopen'))
{
    $content = file_get_contents($file);
}
else
{
    echo 'error';  /* neither available */
}

编辑 b 实际上会编辑更新 a ,因为b指向

的内存位置

答案 1 :(得分:0)

发送数组或对象时,JavaScript是按引用传递的。参考:Is JavaScript a pass-by-reference or pass-by-value language?

要解决您的问题,var a = [1,2,3,4,5]; var b = a; b[0] = 2; console.log(a); //outputs [2,2,3,4,5] 会创建数组的副本。

答案 2 :(得分:0)

在JavaScript中,如果您执行此操作:var x = y其中y对象,x现在是指向y的指针。因此,如果您执行此操作:x.foo = 5y也会foo等于5。但是,如果您执行此操作:x = 10,则不会影响y,因为您要为x分配新值

另请注意,Javascript中的数组对象,因此可以解释您的情况。更多示例(与您的情况类似):

var y = [];
var x = y;
x.push(5);
console.log(x); [5]
console.log(y); [5]
x = 10;
console.log(x); 10
console.log(y); [5]

有关详细信息,请查看this SO answer

答案 3 :(得分:0)

正如大家在这里已经提到的那样,javascript(包括Arrays)中的所有对象都是通过函数中的引用传递的。因此,当您将testArr传递给nextInLine函数时,该函数将使用语句arr.push(item);改变原始数组。

但是,如果您想要阻止这种情况,您可以将testArr的副本/克隆传递给该函数。 制作数组副本的最简单方法是:

var testArr = [1,2,3,4,5];
var copyOfTestArr = testArr.slice(0);

或者,您可以通过不改变原始参数来使nextInLine函数不可变:

function nextInLine(arr, item) {
  var removedItem = arr.concat([item]).shift();

  return removedItem;
}

// Test Setup
var testArr = [1,2,3,4,5];

// Display Code
console.log("Before: " + JSON.stringify(testArr));
console.log(nextInLine(testArr, 6));
console.log("After: " + JSON.stringify(testArr)); //*THIS LINE HERE*

现在,如果你测试这个新函数,你应该得到预期的输出。