对象的引用

在写js程序中,我们总会遇到一些很奇怪的问题,比如对象的引用,百思不得其解,比如

var arr1 = [1,2,3];
var arr2 = [1,2,3];
alert(arr1 == arr2);    //false

弹出一个结结实实的false,这是为什么呢?十万个为什么!!!

赶紧试试其他的类型

var a = 3;
var b = 3;
alert(a == b);    //true

一头雾水。。。。

接着往下看

var arr1 = [1,2,3];
var arr2 = arr1;
arr2.push(4);
alert(arr2);    //[1,2,3,4]
alert(arr1);    //[1,2,3,4]

这都是什么原因,这一切都罪过都要归功于对象的引用

实际上像数字,字符串,布尔值这些基本类型之间的赋值只是值得赋制,而对象之间的赋值,不仅是值的赋值,而且还存在引用关系

对象都是存在内存中的(就像每个人在一个城市中都有一个住所一样)

var arr1 = [1,2,3];
var arr2 = arr1;    
arr2.push(4);
alert(arr2);    //[1,2,3,4]
alert(arr1);    //[1,2,3,4]

但当对象之间进行赋值的时候,就像投奔到你的远方亲戚,你们就住在一块了,也就是说对象这时候在内存中的位置是一样的,这时候当你再向arr2中进行push一个4的时候,那么arr1,也就有了4,因为你们已经住在一起了,你的东西就是我的东西,我的东西就是你的东西,(哈哈,自己瞎掰的,只是没有更形象的一个比喻了,虽然有些牵强,却能说明道理),这也就很能说明为什么弹出的arr1里面也是1,2,3,4

var arr1 = [1,2,3];
var arr2 = arr1;
arr2 = [4,5,6];
alert(arr2);    //[4,5,6]
alert(arr1);    //[1,2,3]

注意上面的代码有一个坑,我们看到alert所弹出的结果,并非我们预想的那样,这是因为arr2进行了重新的赋值,这时候arr2就从arr1中的内存中所脱离出来了,重新找了一个内存地址,就像从你家搬出去了,自己租房子了,这时候arr1和arr2就不存在内存引用关系了,大路朝天,各走一边,这时候arr2的内容的修改就不会对arr1有任何的影响了。

原文地址:https://www.cnblogs.com/chenzhiyu/p/7898598.html