为什么我可以向全局声明的数组添加内容,但不能更改变量本身的值?
这有效:
var test = [5, 5];
function a(test) {
test.push(8);
}
a(test);
console.log(test);
//expected: [5, 5, 8]
但这不是:
var test = [5, 5];
function a(test) {
test = 8;
}
a(test);
console.log(test);
//expected: 8 but is [5, 5]
答案 0 :(得分:1)
在第二个代码中,您将array
对象的引用作为参数传递给函数a
。并且您通过为包含primitive value
的变量分配新的reference
来切断该函数内部的引用连接。因此,全球范围内的阵列根本不会受到影响。
此案例类似于
var x = [];
var y = x; //setting the reference of the object x to y
y = 10; //cutting off the connection to the reference.
console.log(y); //10
console.log(x); //[]
如果你没有用原始值替换引用,那么
var x = [];
var y = x; //setting the reference of the object x to y
y.push(10);
console.log(y); //[10]
console.log(x); //[10]
console.log(x == y); //true
基本上使用全局范围内的值会导致不必要的冲突。如果您想要实现您想要的功能,请删除函数a
的参数。
var test = [5, 5];
function a() {
test = 8;
}
a();
console.log(test); //8
答案 1 :(得分:1)
它不起作用,因为在第二个片段中,您更改了指向具有本地范围的对象(原始值)。
test = 8; // it is no longer pointing to the earlier object in memory so that object value has not changed, just that this reference is pointing to new object.
在此方法a()
完成后,它丢失了局部范围内的对象,并重新获得了在外部范围内的对象。
如果要更改test
的值,并在传递数组的值时
var test = [5, 5];
function a(test) {
test.splice(0,test.length);
test.push(8)
}
a(test);
console.log(test);
这将首先清除test
数组并将8推入其中。