为什么这两个代码的结果不同?
这里是c#
代码:
class Program
{
public static void update(string [] array)
{
string [] newArray = new string [2];
newArray[0] = "myself";
newArray[1] = "version2";
array = newArray;
}
static void Main(string[] args)
{
string[] array = new string[2];
array[0] = "myself";
array[1] = "version1";
Console.WriteLine("{0} {1}", array[0], array[1]);
update(array);
Console.WriteLine("{0} {1}", array[0], array[1]);
Console.ReadLine();
}
}
结果是: 我自己 version1 我自己 version1
这是javascript代码:
function update(arrray) {
var newArray = [2];
newArray[0] = "myself";
newArray[1] = "version2";
array = newArray;
};
var array = ["myself", "version1"];
console.log(array);
update(array);
console.log(array);
结果是: 我自己 version1 我自己版本2
我理解 c#
代码的结果,但我不明白为什么 javascript 会产生不同的结果。谁能解释一下?
最佳答案
主要问题是您在 JavaScript 版本中有一个严重的拼写错误:
function update(arrray) {
// Here ----------^
newArray = [2];
newArray[0] = "myself";
newArray[1] = "version2";
array = newArray;
};
你的函数参数的名称是 arrray
(我猜你感觉像盗版?),但你在函数内部分配给 array
。
您的 update
是创建它的上下文的闭包,它有一个名为 array
的变量,因此您要分配给该变量,这就是为什么您查看该变量的内容变化。
如果您修复了函数参数名称,您会发现结果与 C# 代码中的结果相同:
function update(array) {
// Note fix ----^^^^^
newArray = [2];
newArray[0] = "myself";
newArray[1] = "version2";
array = newArray;
};
var array = ["myself", "version1"];
snippet.log(array); // myself,version1
update(array);
snippet.log(array); // myself,version1 (again)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
您的 JavaScript 代码中还有其他几个重要问题:
您正在成为 The Horror of Implicit Globals 的猎物因为您从未在您现在已经编辑了问题以添加update
中声明您的newArray
变量。var
。初始化
newArray
的行创建了一个包含单个条目的数组,数字2
,然后您立即覆盖它。您的意思可能是newArray = new Array(2)
,它会创建一个length = 2
的数组。但是在 JavaScript 中,您几乎从不想使用new Array
。只需使用newArray = []
。标准 JavaScript 数组 aren't really arrays at all ,无需预先声明它们的长度。函数声明 就像您的
update
声明一样,它们之后不需要;
。它无害,但没有必要。
关于javascript - javascript 和 c# 在将数组传递给函数并在函数内部替换它时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31423084/