JavaScript基础深入之----参数传递的分析与总结
JS的数值类型是分为两类:基本数据类型和引用数据类型。
基本类型占据的内存栈空间,引用类型被保存在堆空间。引用类型赋值的变量也是被保存在栈空间的,它的作用类似于电视遥控器,负责操作堆空间内指向的对象。
var num = 10;
var change = function(obj){
obj = obj+10;
return obj;
}
var result = change(num);
console.log(result)//
console.log(num)//
上面例子把num作为参数传入函数change里面,但是对参数obj的操作并不会影响num原本的值,因为参数是按照值传递的,对于基本数据类型,这里没有什么疑议。
var a = {value:"teacher"};
var b = a;
b.value = "student";
console.log(a);//{value:"student"}
b = 2;
console.log(a);//{value:"student"}
看上面的代码,a变量指向的是一个对象,将a赋值给b变量,这时a和b同时指向了一块内存地址,所以a和b都可以对对象{value:"teacher"}进行操作。当b的value值修改为"student"时,a变量的value值也发生的改变,因为他们操纵的是一块内存地址。但是当我们给b赋值数值2时候,a变量不会改变。带着这个问题,我们看一下JS函数参数的传递。
var object = new Object();
var change = function(obj){
obj.name = "jim";
}
change(object);
console.log(object);//{name: "jim"}
可以看到和我们预想的效果是一致的,还是那句话,变量object和参数obj指向的是一块内存,改变obj就是改变了object。但是这个例子会给我们一种错觉,就是参数是按照引用传递的。js红皮书里面对此有做解释,不管是基本类型还是引用类型,参数都是值传递。参照上一个例子我们在写一个函数的改变参数引用指向的示范。
var object = new Object();
var change = function(obj){
obj.name = "jim";
obj = new Object();
obj.name = "carry";
}
change(object);
console.log(object);//{name: "jim"}
变量object并没有随着参数obj后续的改变而变化。我们不妨随着红皮书作者的思路深入推算一下,个人认为可以分两个层面理解这种传递信息:
层面1:只要是对对象内部的操作,我们可以认为这是引用,这块内存地址相当于object变量和参数obj的连接桥梁,不管是谁操作它,另一个都会有变化。
层面2:任何一个变量的引用地址发生变化的时候,即参数obj指向了其他的内存地址,这时候可以理解为值传递。相信红皮书作者的意思就是这样。变量object和参数obj之间的连接桥梁断掉了,自然参数obj不会对object变量产生影响。而且,局部变量obj指向的新内存地址也会随着函数调用完成之后被GC回收掉。
相对于红皮书作者的参数按值传递的解释,网友们给出了一个看法,就是介于值传递和引用传递之间还有一个共享传递。
其实共享传递只是一种叫法,你可以认为是引用,也可以认为是值,还可以认为是共享。
但是相对于叫法,我们更应该关注的是它内部的原理,即什么情况下两个变量会相互影响,什么情况下不会影响。
最新文章
- AnguarJS 第二天----数据绑定
- ToJson
- 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现
- app的描述
- java中流转化为Object可序列化
- Java for LeetCode 173 Binary Search Tree Iterator
- 25套用于Web UI设计的免费PSD网页元素模板
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
- 【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate
- HTML5的简介
- HTML5和CSS3不仅仅是两项新的Web技术标准
- eclipse慢 优化(转)
- WCF(1)----服务创建
- mysql导入导出sql文件(包括数据库和数据表的操作)
- Parallel线程安全问题
- 对Spring Ioc的理解
- vue项目启动时将localhost替换成指定ip地址
- 【Linux】-NO.87.Assembly.1.滴水逆向.1.001-【介绍】-
- Tomcat启动报错:[Failed to start component]的解决方案
- Selenium+Python:下载文件(Firefox 和 Chrome)
热门文章
- VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程
- Matlab学习记录(函数)
- python入门:最基本的用户登录
- Beyond Compare4.x 破解方案
- Word 借助VBA一键实现插入交叉引用
- Python学习day01
- The 2018 ACM-ICPC China JiangSu Provincial Programming Contest I. T-shirt
- nova虚拟机镜像从创建到文件系统resize完整流程
- Linux压缩与归档
- 取出列表中第N大的数