【问题标题】:JavaScript not resetting a variable in a loopJavaScript不会在循环中重置变量
【发布时间】:2018-04-09 16:51:38
【问题描述】:

想问原因,为什么 JavaScript 不重置变量 在循环的每次迭代之后,在我尝试将其设置为等于函数参数(#1)的情况下。 如果变量等于特定数组(#2),它会重置。

#1
    function almostIncreasingSequence(sequence) {
            for (var i = 0; i < sequence.length; i++) {
                var testArray=sequence;
                testArray.splice(i, 1);
                console.log(testArray);
            }
        }
        almostIncreasingSequence([1, 3, 2, 1]);
#2
    function almostIncreasingSequence(sequence) {
            for (var i = 0; i < sequence.length; i++) {
                var testArray=[1, 3, 2, 1];
                testArray.splice(i, 1);
                console.log(testArray);
            }
        }
        almostIncreasingSequence([1, 3, 2, 1]);

将不胜感激每一个答案。谢谢。

【问题讨论】:

  • 因为splice 修改了数组。
  • 您的var testArray=sequence 不是在创建新数组,而是在引用序列。所以当你拼接 testArray 时,你也在拼接序列。如果你想让它重置,那么你需要var testArray = sequence.slice()
  • @MohammadUsman 他的问题是不理解拼接会在循环继续导致偶尔跳过的索引时删除索引。他的问题是不理解变量赋值以及传递引用和传递值的内容。请删除或更新您的评论。
  • 如果该答案有帮助,您可以将其标记为答案吗?

标签: javascript arrays loops


【解决方案1】:

如上面的评论所述,您对变量赋值感到困惑。

在#1 中,您的印象是var testArray = sequence;var testArray = [1, 3, 2, 1] 相同。事实并非如此。 var testArray = sequence 只是对序列的引用。无论您在 testArray 中修改什么,都会回调到 sequence 并在那里进行修改。

要将#1 修复为#2,您必须执行var testArray = sequence.slice()。这将执行sequence 的浅拷贝,因此修改testArraysequence 没有影响。

function almostIncreasingSequence(sequence) {
  for (var i = 0; i < sequence.length; i++) {
      var testArray=sequence.slice();
      testArray.splice(i, 1);
      console.log(testArray);
  }
}

almostIncreasingSequence([1, 3, 2, 1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多