引用类型


var arr1 = “john”.split(‘’);//j o h n
var arr2 = arr1.reverse(); //n h o j
var arr3 = “jones”.split(‘’);//j o n e s
arr2.push(arr3);
console.log(arr1);
console.log(arr2);
console.log(“array 1: length=” + arr1.length + “ last=” + arr1.slice(-1));
console.log(“array 2: length=” + arr2.length + “ last=” + arr2.slice(-1));

var shuzu1 = [];
var shuzu2 = shuzu1;
shuzu2.push(‘hh’);
console.log(shuzu1)
console.log(shuzu2)
通过上面两个例子,我们发现,数组在赋值之后,改变一个值,则原数组也会改变

var duixiang1 = {};
var duixiang2 = duixiang1;
duixiang2.a=‘hehe’;
console.log(duixiang1)
console.log(duixiang2)
这个对象例子也是一样的,再来看看String()  
String()暂时没有找到改变原字符串的方法,等我再刷一遍红宝书再来看

网上的一个总结,还可以

javascript对象引用与赋值

<script type=”text/javascript”>

//例子一: 引用

var myArrayRef = new Array(0,1,2); //创建数组对象

var mySeconArrayRef = myArrayRef; // 对象复制.

myArrayRef[0] = 100; // 修改元素值

alert(mySeconArrayRef[0]);

/

输出 100; 学过其它语言的都应该知道这里应该输出的是0 为什么输出的是100呢?

上面程序通过把myArrayRef对象复制给了mySeconArrayRef这时就存在了2个独立的 但最初值是相同的对象

因为是独立的为什么修改myArrayRef会对别一个对象有影响呢?大家都知道只有当他们引用的是同一个对象时这时修改一个才会

对别一个产生影响.但是在javascript语言中创建的对象myArrayRef值中其时保存的是对象的引用(也就是一个地址).

也就是 我用 new Array生成的保存在内存中而new Array把它所在的地方告诉了myArrayRef,myArrayRef又把这地址告诉了mySeconArrayRef

他们两个都指向的是new Array生成对象的地址而不是把对象保存在myArrayRef中,所以通过其中的一个去修改值时其时是修改他们同指象的那对象.

*/

alert(mySeconArrayRef[0] );

//例子二: 赋值

var myVa = ‘ABC’; //把ABC的值 赋予了myVa

var myVb = myVa; // myVa 赋值给 myVb

myVa = ‘DEF’; //修改myVa

/

输出的是:ABC. 因为是把值保存在了变量了 而不是保存的是引用地址,所以他们两个是相对独立的整体.

/

alert(myVb);

</script>

如果真要复制对象互不影响,则要通过转换赋值或者遍历key:value来复制你中的方法和属性。

注意:对象的子对象也是引用,所以遍历赋值的时候要判断,子元素是否是对象,如果子元素是对象,则继续对子元素进行遍历赋值。
转换赋值方式:

复制代码
var data = {a:1,b:2,c:3,d:[0,1,2,3]};
var str = JSON.stringify(data);
var data1 = $.parseJSON(str); //$为jQuery对象需要引入jQuery包
data1[
e] = 4;
data1[
d][0] = 11;
console.log(data);
console.log(data1);
复制代码

输出结果:
{a1b2c3d: [0,1,2,3]}
{a1b2c3d: [11,1,2,3], e: 4}

相互没有影响

 

当对象引用做为函数参数传递时候,依然会相互影响,切记,如下示例:

 

 

复制代码
var data = {a:1,b:2,c:3,d:{q:4,w:5,e:6}};
var data1 = data;
function con(data2){
data2[
r] = 5;
console.log(JSON.stringify(data2));
}
con(data1);
console.log(JSON.stringify(data));
复制代码

输出结果:

{“a”:1,”b”:2,”c”:3,”d”:{“q”:4,”w”:5,”e”:6},”r”:5}
{“a”:1,”b”:2,”c”:3,”d”:{“q”:4,”w”:5,”e”:6},”r”:5}
 
对象引用赋值后,如果将对象置空,相互间是不受影响的,如下:我觉得这里不是将对象置为空,而是赋了一个新的空对象,arr不在指向原来的对象,所以不受影响
var arr = {a:1,b:2};
var arr1 = arr;
arr
= {};
arr[
a] = 2;
console.log(arr1);
console.log(arr);

输出结果:{“a”:”1”,”b”:”2”},{“a”:2}