我是一般的javascript和编码新手,我可以使用一些帮助。
我正在设置一个全局变量(generatedNumbers)等于另一个变量(数字),以便我可以对数组进行一些验证。但是,当我更改数字的值时,我的全局变量generatedNumbers也会更改。任何帮助将不胜感激。
var generatedNumbers;
function generateNumbers(numberOfNumbers) {
'use strict';
var i;
generatedNumbers = [];
for (i = 0; i < numberOfNumbers; i = i + 1) {
generatedNumbers.push(generateRandomNumber(9).toString());
}
}
function checkEachValidNumberUsed(userExpression, numbers) {
'use strict';
var i, j;
for (i = 0; i < userExpression.length; i = i + 1) {
for (j = 0; j < numbers.length; j = j + 1) {
if (userExpression[i] === numbers[j]) {
numbers.splice(j, 1);
window.console.log(generatedNumbers);
}
}
}
if (numbers.length !== 0) {
return true;
}
}
function validateExpression(userExpression) {
'use strict';
var numbers, validUserInput;
numbers = generatedNumbers;
window.console.log(generatedNumbers);
if (checkEachValidNumberUsed(userExpression, numbers)) {
document.getElementById("feedbackText").innerHTML = "Each number must be used exactly once.";
} else {
return true;
}
答案 0 :(得分:0)
那是因为他们都指的是同一个对象。如果您要复制generatedNumbers
(我认为您希望在validateExpression
中执行此操作),请使用slice
。
numbers = generatedNumbers.slice(0);
答案 1 :(得分:0)
如果你有一个数组,那么在Javascript中
var a = [1,2,3,4];
并将a
分配给另一个变量
var b = a;
这两个引用了相同的数组对象...例如在
之后b.push(99);
a
也会看到变异数组。
如果您想制作副本,则需要明确地进行复制,例如使用
var b = a.slice();
答案 2 :(得分:0)
当您使用赋值运算符=
或将它们传递给函数时,数组(以及所有其他非基本类型)是传递引用而不是复制,因此对{{1}进行的任何更改}(或numbers
的元素值)将反映在numbers
。
对于你的数组,generatedNumbers
将充分克隆数组,但请记住,如果数组的内容不是基本类型(例如,使用numbers = generatedNumbers.slice(0);
关键字的任何对象不会被克隆:两个数组都会引用相同的对象。