javascript - javascript 和 c# 在将数组传递给函数并在函数内部替换它时的区别

标签 javascript c#

为什么这两个代码的结果不同?

这里是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 代码中还有其他几个重要问题:

  1. 您正在成为 The Horror of Implicit Globals 的猎物因为您从未在 update 中声明您的 newArray 变量。您现在已经编辑了问题以添加 var

  2. 初始化 newArray 的行创建了一个包含单个条目的数组,数字 2,然后您立即覆盖它。您的意思可能是 newArray = new Array(2),它会创建一个 length = 2 的数组。但是在 JavaScript 中,您几乎从不想使用 new Array。只需使用 newArray = []。标准 JavaScript 数组 aren't really arrays at all ,无需预先声明它们的长度。

  3. 函数声明 就像您的update 声明一样,它们之后不需要;。它无害,但没有必要。

关于javascript - javascript 和 c# 在将数组传递给函数并在函数内部替换它时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31423084/

相关文章:

javascript - 使用 Superagent 通过 ajax 提交包含图像值的表单

javascript - 如何在 React-router 包装器中处理异步请求

javascript - 错误未捕获引用错误 : Morris is not defined

javascript - 防止按键事件中输入字段出现空格

c# - 在 C# 中访问 C++ 结构体

c# - 部分 protected 接口(interface)但没有抽象类

c# - 模拟对象在单元测试中为空

javascript - 如何在 Material 表中使用自定义 'editComponent'?

c# - 什么时候使用代码块?

c# - Azure 存储 - 403 禁止访问