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]
,不做任何更改!
感谢任何帮助。谢谢。
答案 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 = 5
,y
也会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*
现在,如果你测试这个新函数,你应该得到预期的输出。