一旦我获得对象的副本

时间:2017-08-28 09:38:42

标签: javascript callback reference ecmascript-6

我有这段代码:

testObj = [
    {param: 'blue'},
    {param: 'green'}
];

function testFunction(callBack){
    callBack(testObj[0]);
}

testFunction((param) => {
    param = {param: 'red'};
});

console.error(testObj);

执行后我得到:

Console err

如果我将对象放入callBack函数并且它应该是一个引用,那么为什么主对象不会改变,但是我得到了新的coppied obj。

另一方面,当我在数组上工作时,我得到了参考:

testObj = [
    {param: 'blue'},
    {param: 'green'}
];

function testFunction(callBack){
    callBack(testObj, 0);
}

testFunction((arr, index) => {
    arr[index] = {param: 'red'};
});

console.error(testObj);

我改变了数组:

Console err

根据我的知识原语应该是coppied,但对象应该作为参考传递。所以我也期待在第一个例子上改变数据。

为什么它没有发生?

2 个答案:

答案 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);