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中基本类型是如何进行属性和方法操作的
- JavaScript中的基本类型和引用类型的复制使用
- Javascript中的基本类型和引用类型
- JavaScript中的基本类型和引用类型
- javascript的基本类型和引用类型
- JavaScript的基本类型和引用类型
- Javascript 中的引用类型和基本类型(值类型)
- javascript 中的引用类型和值类型,复制与拷贝
- JavaScript中的基本类型值和引用类型值区别
- JavaScript中的基本类型与引用类型
- JavaScript中的基本类型和引用类型的赋值问题和传参问题
- JavaScript基本类型和引用类型
- javascript基本类型和引用类型浅析
- JavaScript基本类型和引用类型
- javaScript基本类型和引用类型
- JavaScript 基本类型和引用类型
- JavaScript基本类型和引用类型的值
- 简单分析JAVASCRIPT的基本类型和引用类型
- JavaScript基本类型和引用类型的不同
- 奇怪的函数 题解
- 变量的解构赋值
- linux硬链接与软链接
- static和volatile的用法
- 优雅地实现入参非空判断
- JavaScript中的基本类型和引用类型的复制使用
- KindEditor 的 html 标签自动解码问题
- win10下使用VMware12安装MAC OS 10.12遇到的问题,无MAC OS安装选项,无法安装VMwareTools等
- 解决win下安装wordcloud出错问题
- volatile与编译器优化
- Linux下Memcached的安装 开机自启动
- 进程收不到网络数据,但 tcpdump 能抓到包
- Android之framework修改底部导航栏NavigationBar动态显示和隐藏
- STM32DMA使用详解