对象JavaScript中的奇怪行为数组

对象JavaScript中的奇怪行为数组,javascript,Javascript,为什么b.first[0]返回“t”以及如何避免这种情况 我需要b中的安全“q”。首先[0] var extend = function(o,p){ for(prop in p){ o[prop] = p[prop]; } return o; }; var a = {first:['q','w']}; var b = {}; extend(b,a); document.write(a.first[0]); //q document.write(b.f

为什么b.first[0]返回“t”以及如何避免这种情况

我需要b中的安全“q”。首先[0]

var extend = function(o,p){
    for(prop in p){
        o[prop] = p[prop];
    }
    return o;
};

var a = {first:['q','w']};
var b = {};

extend(b,a);

document.write(a.first[0]); //q
document.write(b.first[0]); //q

a.first[0] = 't';

document.write(a.first[0]); // t
document.write(b.first[0]); // t ?????????????????????

这是一个与以下概念相关的问题:通过a扩展b不会从a重新创建数据。如果某些数据是一个对象(如数组),则它只是“指向”该数组,而不是创建一个新的、相同的数组。实际上,您存储了指向同一数组的两个指针,因此当您更改其中一个指针时,您也会更改另一个指针

下面是一个答案,它更详细地讨论了在Javascript中“克隆”对象的想法


这是一个与概念相关的问题,即通过a扩展b不会从a重新创建数据。如果某些数据是一个对象(如数组),则它只是“指向”该数组,而不是创建一个新的、相同的数组。实际上,您存储了指向同一数组的两个指针,因此当您更改其中一个指针时,您也会更改另一个指针

下面是一个答案,它更详细地讨论了在Javascript中“克隆”对象的想法


因为
a.first
是对数组的引用。分配
b.first=a.first
时(这是extend似乎要做的),然后
b
会获得对同一数组的引用。您需要对象的深度副本。在现实中,我使用了一些deepExtend,但我的版本似乎不太好。我将尝试其他版本。谢谢因为
a.first
是对数组的引用。分配
b.first=a.first
时(这是extend似乎要做的),然后
b
会获得对同一数组的引用。您需要对象的深度副本。在现实中,我使用了一些deepExtend,但我的版本似乎不太好。我将尝试其他版本。谢谢