日期:2014-05-16  浏览次数:20436 次

请问“引用”是什么意思?它和浅拷贝有啥关系?
比如说:
var obj1={a:1,b:2};
var obj2;
obj2=obj1 这能说obj2 "引用了"obj1吗?
还是
var obj2={}
obj2.attribute=obj1  这个叫obj2"引用了"obj1?

还有一个问题是不是无论obj2=obj1,还是obj2.attribute=obj1  这两个都叫浅拷贝啊?

------解决方案--------------------
如果将赋值可以看做拷贝的话,那么现在这种情况是浅拷贝,就是说obj2和obj1指向了同一个对象。

obj2=obj1 这能说obj2 "引用了"obj1吗?
可以

obj2.attribute=obj1  这个叫obj2"引用了"obj1?
将偶obj1对象赋给obj2的attribute属性,我感觉这样表达跟准确
------解决方案--------------------
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象;
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。

引用是js面向对象的基本概念之一。它是一个指向对象实际位置的指针。实际的对象肯定不会是引用。比如字符串永远是字符串,不过多个变量能够指向同一个对象。
引用指向的只能是具体的对象,当具体对象改变的时候,引用还是引用原来的对象,而不是改变后的对象。
------解决方案--------------------
只要是没有变成两个实体,能过地址指向,都可以叫引用 
 obj2引用了obj1?,详细点说obj2 的属性attribute 引用了obj1
------解决方案--------------------
引用:
其实我现在就想确认下:
var obj1={a:1,b:2};
var obj2;
obj2=obj1;

法二:
var obj1={a:1,b:2};
var obj2={}
obj2.attribute=obj1;

是法一叫obj2引用了obj1,还是法二叫obj2引用了obj1?

其实不管法1,法2.你这样理解对象的引用:
var obj1={a:1,b:2};  -> 创建了变量boj1,它保存了一个内存地址(xxx)。这个内存地址(即可理解为引用)里存放的就是{a:1,b:2}。
var obj2; -> 创建了变量obj2.但它没有保存任何内存地址。
obj2=obj1; -> 将obj1保存的内存地址赋值给obj2。此时obj2也就保存了相同的内存地址(xxx)。
这样当系统不论在调用obj1还是obj2时都通过他们保存的内存地址去找他们所指的对象。

对于法2里的attribute的情况同理。

上面只是对于对象来说。对于基本类型就不保存内存地址,而直接就是数值本身了。