Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么更改属性的值会更改数组中所有同名属性的值?_Javascript - Fatal编程技术网

Javascript 为什么更改属性的值会更改数组中所有同名属性的值?

Javascript 为什么更改属性的值会更改数组中所有同名属性的值?,javascript,Javascript,为什么更改属性的值会更改数组中所有类似属性的值?如何在不使用'name'的this关键字的情况下使其正常工作 let对象={ “名称”:“测试对象” } 让数组=[] Array.push(对象) Array.push(对象) Array.push(对象) 数组[0]['name']='Changed' console.log(Array)//只希望更改名字,但所有3个都会更改…您没有更改“名称相似”的对象,而是更改同一个对象 对于非原语(基本上不是字符串、数字或布尔值的所有内容),它们通过引

为什么更改属性的值会更改数组中所有类似属性的值?如何在不使用
'name'
this
关键字的情况下使其正常工作

let对象={
“名称”:“测试对象”
}
让数组=[]
Array.push(对象)
Array.push(对象)
Array.push(对象)
数组[0]['name']='Changed'
console.log(Array)//只希望更改名字,但所有3个都会更改…
您没有更改“名称相似”的对象,而是更改同一个对象

对于非原语(基本上不是字符串、数字或布尔值的所有内容),它们通过引用传递。这意味着,当您将它们添加到数组或将它们传递给函数时,基本上就是在传递它们的地址。如果你传递它3次,它们都指向同一个地址;现在只有一本。改变一个,你就改变了所有

const a={b:1};
常数arr=[a,a,a];
//一模一样
log(arr[0]==arr[1],arr[1]==arr[2],a==arr[0]);
a、 b=5;
//所有3个都改变了,因为这是同一件事
log(arr.map(a=>a.b));
函数someFunc(obj){obj.b=10};
someFunc(a);
//从内部函数更改为同一对象

控制台日志(a.b)当调用
Array.push(Object)
时,将对同一对象的引用推入数组3次。推送不会复制
对象
-仅存在1个
对象

如果要在一个数组中包含3个相同的对象,请尝试以下操作:

let vArray = []

for(i = 0; i <= 2; i++) {
    //We're going to loop this 3 times, creating 3 different
    //objects and pushing each of them into the array

    let vObject = {
        'name' : 'Test Object'
    }

    vArray.push(vObject)
}

vArray[0]['name'] = 'Changed'

console.log(vArray) // Only the first one will have been changed.
让vArray=[]

对于(i=0;i我要寻找的答案是将我的答案中的语法更改为
Array.push({…Object})
。这将创建一个要推送的“新”对象,只增加5个字符


我不知道“object spread syntax”本质上就是这样做的。

非原语(如对象)是通过引用传递的,而不是通过值传递的。这可能与我使用的语法完全相同,只是它在for循环中,为什么这会突然起作用?这不会起作用,因为您正在为var使用尊崇的名称
数组
,并且将ve
Uncaught TypeError:无法为行
数组[0]['name']设置未定义的属性'name'='Changed'
@MuhammadOmerAslam你是对的-我使用了与OP相同的名称,因此很清楚我在他的问题上下文中引用了什么。我稍微修改了一下,以便可以更容易地复制/粘贴。@Gallaxhar因为
vObject
的创建在循环中,每次都在创建一个新对象(
let
释放旧的
vObject
变量并创建一个新变量)。在你的问题中,你创建一个对象,然后在数组中引用它3次。在我的示例中,我创建了3个单独的对象,并引用数组中的每个对象。为什么这个答案被否决了?我没有发现任何东西,它清楚地解释了需要理解的主要内容,投票up@MuhammadOmerAslam谢谢,我也很困惑不,在投票狂潮中,我非常讨厌这样的人:/这实际上阻止了一个好的答案被突出显示,这是这样做的主要原因,一个好的答案应该受到赞赏。干杯。@MuhammadOmerAslam不是投票狂潮的人,但很可能是因为这个问题以前被问过很多次-最好是作为一个经典的复制品结束我更新了我的答案,进一步解释了如何用对象的副本而不是三个引用来填充数组。