Javascript全局变量设置为新值

时间:2015-12-21 17:36:25

标签: javascript

我是一般的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;
}

3 个答案:

答案 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);关键字的任何对象不会被克隆:两个数组都会引用相同的对象。