我目前正在学习JavaScript,并对以下代码有疑问。
var testArr = [1, 2, 3, 4, 5];
function nextInLine(arr, item) {
arr.push(item);
arr.shift();
}
console.log("Before: " + testArr);
nextInLine(testArr, 6);
console.log(" After: " + testArr);
输出为:
之前:1,2,3,4,5
之后:2,3,4,5,6
我希望testArr
和Before
和After
的变化不会完全相同,因为据我所知,函数参数不是全局的。
但是该函数实际上操作了全局变量testArr
,即使它从未在函数中被提及,而只是作为参数输入。
如果有人能向我解释为什么testArr
会在函数中被操纵以及如何更改它,我将非常感激。
答案 0 :(得分:1)
在JS中,没有像其他编程语言(如C ++)那样按值或按引用传递变量的事情。 处理此类问题的方法是创建要临时修改的对象的副本。您可以在下面看到区别
function changeAgeImpure(person) {
person.age = 25;
return person;
}
var alex = {
name: 'Alex',
age: 30
};
var changedAlex = changeAgeImpure(alex);
console.log(alex); // -> { name: 'Alex', age: 25 }
console.log(changedAlex); // -> { name: 'Alex', age: 25 }
alex是一个全局变量,但是正如您所看到的那样,它已由changeAgeImpure函数更改。
解决此类问题的方式(至少在我的示例中)是这种方式:
function changeAgePure(person) {
var newPersonObj = JSON.parse(JSON.stringify(person));
newPersonObj.age = 25;
return newPersonObj;
}
var alex = {
name: 'Alex',
age: 30
};
var alexChanged = changeAgePure(alex);
console.log(alex); // -> { name: 'Alex', age: 30 }
console.log(alexChanged); // -> { name: 'Alex', age: 25 }
现在,由于我们已经创建了一个中间变量,因此函数不会更改alex变量。