1

看看下面的代码,是否theme[sprite].img嵌套在里面result[definition].data(就像theme[sprite].img里面theme[sprite]一样)以及.img成为它自己的元素result[definition]

result[definition].data = theme[sprite];
result[definition].img = theme[sprite].img;

如果是这样的话,如果result[definition].data.img被删除会发生什么,那也会删除result[definition].img甚至theme[sprite].img

谢谢。

4

3 回答 3

5

如果你 delete result[definition].data.img, thentheme[sprite].img也将被删除,因为result[definiton].datatheme[sprite]是完全相同的单个对象。result[definition].img将保留其值,因为result[definition]它是在其属性中具有来自另一个对象的.img副本的单独对象。.img

不过,这与嵌套没有任何关系。您只需引用同一个对象。

于 2012-05-20T14:45:04.803 回答
3

如果result[definition].data.img被删除了,那也会删除result[definition].img吗...

不,对象是引用类型。虽然删除会从 观察到theme[sprite] ,但不会从 观察到result[definition]

因为theme[sprite]result[definition].data是对同一个对象的引用,所以对该对象所做的任何更改都可以从对它的任何引用中观察到。

但是因为result[definition].img是对碰巧被另一个对象引用的不同对象的引用,所以它是一个完全唯一的引用,并且不受另一个对象中发生的事情的影响。



       +-----------+ +------------+
       | | 精灵 | |
 主题 | |-------->| |\     v---删除此引用...
       | | | | \
       +-----------+ +------------+ \   img    +-----------+
                                   ^ \ | |
                                  / \----> | |
                                 / | |
                                / +-----------+
                   定义/^
                              //
       +-----------+ / /
       | | //
结果 | |-------/                 图片       /
       | |----------------------------------/
       +-----------+
        ...不影响这个-----------^
           反之亦然

如果您删除其中一个img属性,另一个将保持不变。

于 2012-05-20T14:52:12.407 回答
1

Oleg 和 Cliffs 的答案是正确的。但是,我认为出于可视化目的,查看这些对象的实际形状可能很有用:

var definition = "Foo",
    sprite     = "Bar",

    result = {},
    theme  = {}
;

result[ definition ] = {}
// => result == { Foo : {} }

theme[ sprite ] = { img : "BAZ" }
// => theme == { Bar : { img : "BAZ" } }

result[ definition ].data = theme[ sprite ];
// => result == { Foo : {
//                  data : { img : "BAZ" }
//                }
//              }

result[ definition ].img  = theme[ sprite ].img;
// => result == { Foo : {
//                  data : { img : "BAZ" },
//                  img  : "BAZ"
//                }
//              }

delete result[ definition ].data.img;

console.log( result.[ definition ].data.img );
// => undefined


console.log( theme[ sprite ].img );
// => undefined

console.log( result[ definition ].img
// => "BAZ"
于 2012-05-20T15:07:55.707 回答