我有这段代码:
testObj = [
{param: 'blue'},
{param: 'green'}
];
function testFunction(callBack){
callBack(testObj[0]);
}
testFunction((param) => {
param = {param: 'red'};
});
console.error(testObj);
执行后我得到:
如果我将对象放入callBack函数并且它应该是一个引用,那么为什么主对象不会改变,但是我得到了新的coppied obj。
另一方面,当我在数组上工作时,我得到了参考:
testObj = [
{param: 'blue'},
{param: 'green'}
];
function testFunction(callBack){
callBack(testObj, 0);
}
testFunction((arr, index) => {
arr[index] = {param: 'red'};
});
console.error(testObj);
我改变了数组:
根据我的知识原语应该是coppied,但对象应该作为参考传递。所以我也期待在第一个例子上改变数据。
为什么它没有发生?
答案 0 :(得分:0)
如果我将对象放入callBack函数并且它应该是引用
,为什么主对象不会改变
您已更改param
参数(param = ...
)中的值。您尚未更改对象的状态。但是在您的数组示例中,您更改了数组的状态(arr[index] = ...
)。
但不是这样,我得到了新的cojied obj。
不,这不是副本。这是同一个目标。
您的数组示例的等效项将在对象上设置属性:
testObj = [
{param: 'blue'},
{param: 'green'}
];
function testFunction(callBack){
callBack(testObj[0]);
}
testFunction((param) => {
param.param = {param: 'red'};
// -^^^^^^
});
console.error(testObj);
旁注:除非您在某处声明testObj
,否则该代码将成为The Horror of Implicit Globals *的牺牲品。
* (这是我贫血的小博客上的帖子)
答案 1 :(得分:0)
必须参考对象设置参数,尝试运行2个代码段。您正在更改参数的值,但不更改数组中的值
testObj = [
{param: 'blue'},
{param: 'green'}
];
function testFunction(callBack){
callBack(testObj[0]);
}
testFunction((param) => {
param = {param: 'red'};
// changes would not get reflected globally
console.log('debug', param);
// changes would get reflected locally
});
console.log(testObj);
testObj = [
{param: 'blue'},
{param: 'green'}
];
function testFunction(callBack){
callBack(testObj[0]);
}
testFunction((param) => {
param.param = 'red';
});
console.log(testObj);