标签:为什么 哈哈 字符 style 地址 span var 程序 自己
在写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有任何的影响了。
标签:为什么 哈哈 字符 style 地址 span var 程序 自己
原文地址:http://www.cnblogs.com/chenzhiyu/p/7898598.html