gpt4 book ai didi

javascript - 为什么 Array.prototype.pop() 会影响其他数组?

转载 作者:行者123 更新时间:2023-11-30 16:41:40 24 4
gpt4 key购买 nike

我正在尝试解决一个 coderbyte 挑战,在这个挑战中我必须比较字符串中每个单词的字母并返回具有最多重复字母的单词。例如:“ Hello World ”->“你好”

我仍在尝试解决问题,但我遇到了一些涉及 Array.prototype.pop() 的奇怪行为;

这是我的代码:

function LetterCountI(str) { 

str = str.split(" ");

var largest = "";
var letterCount = 0;

for (var i = 0; i <str.length;i++) {
letterCount = findMatches(str[i].split(""));
}

function findMatches(array) {
var letterCount = 0;
while (array.length) {
var letter = array.pop();
var counter = 0;
var arrayCopy = array;
letterCount += compareRecursive(letter, arrayCopy, counter);
}
return letterCount;
}

function compareRecursive(letter, a, counter) {
if (a.length === 0) {
return counter;
}
var n = a.pop();
if (letter === n) {
counter++;
}
return compareRecursive(letter, a, counter);
}
return letterCount;
}

发生的事情是我在我的 compareRecursive 函数中使用 Array.prototype.pop() 来返回数组的最后一个索引并使数组更小,以便我可以遍历整个字符串。我在 findMatches 函数中调用 compareRecursive。在我调用 compareRecursive 之后,数组变量和 arrayCopy 变量被清空。根据我对作用域的理解,compareRecursive 函数应该有自己的数组副本,因为我将它作为参数传入,为什么 Array.prototype.pop() 会影响我的 findMatches 函数中的数组和 arrayCopy 变量?

当我换行的时候

var n = a.pop();

收件人:

var n = a[0];
a = a.slice(1);

findMatches 函数中的 array 和 arrayCopy 变量不受影响。为什么是这样?

最佳答案

pop() 改变现有数组,删除最后一项。 slice() 返回数组的浅拷贝,而不是原始数组。

// pop
var foo = [1, 2, 3];
var three = foo.pop(); // "pops out" 3 from the array
// foo = [1, 2]
// three = 3;

// slice
var foo = [1, 2, 3];
var three = foo.slice(-1)[0]; // Creates new array with 3 inside (ie. [3])
// foo = [1, 2, 3];
// three = 3;

如果想在不影响原数组的情况下使用pop(因为pop就是这么方便),可以使用slice来创建数组的副本并弹出它。

var originalArray = [1, 2, 3];
var arrayClone = originalArray.slice();
var poppedItem = arrayClone.pop();
// originalArray = [1, 2, 3];
// arrayClone = [1, 2];
// poppedItem = 3;

关于javascript - 为什么 Array.prototype.pop() 会影响其他数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31880383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com