我有两个功能。一个是不纯的函数,只返回另一个的结果。我对两种不同方式之间的结果差异感到困惑。
功能:
function reverseArray(array) {
var newArray = [];
for(i = 0; i < array.length; i++) {
newArray.unshift(array[i]);
}
return newArray;
}
function reverseArrayInPlace(array) {
return reverseArray(array);
}
我打电话的时候:
console.log(reverseArrayInPlace(["one", "two"]));
控制台显示我的期望,即:["two", "one"]
但是当我将数组分配给变量时,将其作为arg传递,然后登录到控制台,如下所示:
var foo = ["one", "two"];
reverseArrayInPlace(foo);
console.log(foo);
我得到["one", "two"]
为什么后一种情况产生的结果与前者不同?
答案 0 :(得分:1)
因为您的代码是“按值调用”。
当使用显式参数foo调用reverseArrayInPlace时,会为函数体生成一个foo的副本。该功能不会改变原来的foo。
为了将foo设置为函数的返回值,可以编写
x = open('C:/Users/Acer/Desktop/test3.txt', 'w')
for i in longlist:
x.write("%s, " % i)
x.close()
答案 1 :(得分:1)
就像你没有改变程序中的状态而只是返回一个值一样简单。因此,如果你想影响foo的变化,你必须将它设置为等于reverseArrayInPlace的结果
固定:
var foo = ["one", "two"];
foo = reverseArrayInPlace(foo);
console.log(foo);
答案 2 :(得分:1)
newArray.unshift(array[i])
prepends将元素传递到数组的前面。请注意,元素列表作为整体预先添加,以便前置元素保持相同的顺序。所有数值数组键都将被修改为从零开始计数,而文字键不会被触及。
看一下这个例子:
<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
?>
以上示例将输出:
Array
(
[0] => apple
[1] => raspberry
[2] => orange
[3] => banana
)
请注意,如果传递数组["something","another"]
,则取消移位["another","something"]
,但不返回变量。
答案 3 :(得分:0)
第一个代码打印函数的结果,第二个代码打印函数的参数。
要查看该行为是否相同:
var foo = ["one", "two"];
console.log(reverseArrayInPlace(foo));
附注:
reverseArray
/ reverseArrayInPlace
都是纯函数(不更改值/状态,并为同一输入返回相同的结果)foo
看起来更改 - 为了实现这一点,您需要修改作为参数传入的数组,而不是创建新数组。代码显示了一种更改数组的方法:
function reverseArrayInPlace(array) {
var reversed = reverseArray(array);
for(var i = 0; i < array.length; i++)
{
array[i] = reversed[i];
}
}
var foo = ["one", "two"];
reverseArrayInPlace(foo);
console.log(foo); // ["two", "one"]