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 相关文章推荐
this[] 指的是什么内容 讨论
Mar 24 Javascript
javascript操作文本框readOnly
May 15 Javascript
超级退弹代码
Jul 07 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
基于javascript实现泡泡大冒险网页版小游戏
Mar 23 Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 Javascript
Javascript 函数的四种调用模式
Nov 05 Javascript
JS生成和下载二维码的代码
Dec 07 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
layui下拉列表select实现可输入查找的方法
Sep 28 Javascript
原生js实现碰撞检测
Mar 12 Javascript
JavaScript隐式类型转换代码实例
May 29 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
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
IE 下的只读 innerHTML
2009/08/21 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
班主任新年寄语
2014/04/04 职场文书
民族学专业求职信
2014/07/28 职场文书
遗愿清单观后感
2015/06/09 职场文书
学校远程教育工作总结
2015/08/11 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript