JavaScript中的基本类型和引用类型的复制使用

来源:互联网 发布:腾讯问卷怎么导出数据 编辑:程序博客网 时间:2024/06/08 04:55

js中的数据类型分为两种:基本类型和引用类型。
基本类型:number,string,boolean,undefined,null
引用类型:object, function, array
基本类型是存放在栈中的,而引用类型时存放在堆中的(可以理解为使用引用类型时,对引用类型的复制只是在栈中开辟一块内存存放指向了堆内存中的引用类型的地址,并没有真正的复制引用对象)。

基本类型的复制:
基本类型的复制其实就是在栈中开辟了一块新的内存来存放新的变量,这个变量的值是自己的,不过是和前面的相同,它们是相互独立存在的,其中一个改变不会影响到其他的值。
ex:

var foo = 3;var bar  = foo;foo = null;console.log(bar);     //3 

因为a,b均保存在栈中,a的改变并不会影响到b的值,所以它们之间的值互不影响。

引用类型复制
声明的对象其实是在栈内存中开辟了一块内存存储了一个指针,该指针指向堆内存中引用对象的存储地址。复制对象的过程就是把对象的地址复制给了另外一块栈内存 即另一个对象变量,两个指针均指向同一个堆中的对象,所以其中一个修改,另一个也会被修改。

var foo = {};var bar = foo;bar.sex = "male";console.log(foo.sex);    // male

由于它们两个指向的是同一个对象,bar改变的是foo在堆中的引用,所以foo的sex属性也是male。
那麽问题来了, 当我们把其中的一个赋值为null时,另一个是不是也成了空对象呢?答案是No。
example:

var foo = {};var bar = foo;bar.sex = "male";console.log(foo.sex);    // malefoo = null;console.log(bar.sex);    //male

由上例子可以看出当我们把一个对象置空时并不会改变另一个对象,为什么呢?
答:那是因为foo不再指向堆中的对象,null值在此表示一个空对象指针。但是堆中的那个对象仍然存在,栈中的bar仍然指向它。

那么还有点小问题:不是说基本类型是放在栈中,没有属性和方法麽? 那怎么Number还有toString(),toPrecision(),String还是有那些length, substring(), split()等等一大堆属性,方法呢?

相关文章:JavaScript中基本类型是如何进行属性和方法操作的

原创粉丝点击