JavaScript传递变量: 值传递?引用传递?


Posted in Javascript onFebruary 22, 2011

当变量A赋值给变量B时,会将栈中的值复制一份到为新变量分配的空间中。

如何理解?

var x = y = 1; 
y = 2; 
alert(x);

x的值为多少?
var obj = {}; 
var sub = {}; 
sub['id'] = 3; 
obj['sub'] = sub; 
sub['id'] = 4; 
alert(obj['sub']['id']);

obj['sub']['id']的值又为多少?他们真的符合你的预期吗?

我们分别运行2段代码,发现第1段程序中x的值没有改变,而第2段程序中的obj['sub']['id']的值却改变了。同样是一个赋值操作,同样是修改另外一份拷贝的值,为什么一段程序源变量没变,一段程序源变量变化了呢?这个传递到底是按值传递还是按引用传递的呢?

李松峰翻译的《JavaScript 高级程序设计 第二版》中给出了答案。
在开始的这2个例子中,事实上都复制了A的值给B,不同的是,在第一个例子中,A的值是int型的1,而在第二个例子中,A的值是一个地址指针,这个地址指针可以访问到一个对象,复制之后,第1个例子中的B的值变成了新的int, 他的值为1,而第2个例子中B的值变成了新的地址指针,他的值为这个对象的地址。

下面的例子可以帮助理解

function setName(obj){ 
obj.name = "test1"; 
obj = {}; 
obj.name = "test2"; 
} 
var person = new Object(); 
setName(person); 
alert(person.name);

可以看到的是,尽管调用了setName函数修改了变量的name属性,但是person.name的值并没有改变。这是因为在函数中,obj指向的地址被改变了,因此修改这个地址的name属性,并不会对原地址的name属性造成影响。从另一个方面,也印证了JavaScript的传递是按值传递。
Javascript 相关文章推荐
做网页的一些技巧
Feb 01 Javascript
JavaScript Cookie的读取和写入函数
Dec 08 Javascript
将函数的实际参数转换成数组的方法
Jan 25 Javascript
Javascript脚本实现静态网页加密实例代码
Nov 05 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
Feb 22 Javascript
iframe调用父页面函数示例详解
Jul 17 Javascript
js实现简单的左右两边固定广告效果实例
Apr 10 Javascript
JavaScript实现获得所有兄弟节点的方法
Jul 23 Javascript
JS实现在状态栏显示打字效果完整实例
Nov 02 Javascript
如何高效率去掉js数组中的重复项
Apr 12 Javascript
d3.js实现简单的网络拓扑图实例代码
Nov 06 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
Jul 30 Javascript
JavaScript中的排序算法代码
Feb 22 #Javascript
JavaScript中几种常见排序算法小结
Feb 22 #Javascript
用JS控制回车事件的代码
Feb 20 #Javascript
apycom出品的jQuery精美菜单破解方法
Feb 18 #Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 #Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 #Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
Feb 16 #Javascript
You might like
德生9700DX电路分析
2021/03/02 无线电
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
课程设计心得体会
2013/12/28 职场文书
自我评价的写作规则
2014/01/06 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
用JS写一个发布订阅模式
2021/11/07 Javascript