我目前正在学习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
和After
Before
的变化不会完全相同,因为据我所知,函数参数不是全局的。
但是该函数实际上操作全局变量testArr
即使它从未在函数中提及,而只是作为参数放入。
如果有人能向我解释为什么testArr
在函数中纵以及我如何改变这一点,我将不胜感激。
在 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 是一个全局变量,但正如你所看到的,它被函数 changeAgePure 改变了。
您解决此类问题(至少在我的示例中(的方式是这样的:
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 变量不会被函数更改,因为我们已经创建了一个中间变量。