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 相关文章推荐
贴一个在Mozilla中常用的Javascript代码
Jan 09 Javascript
js 面向对象的技术创建高级 Web 应用程序
Feb 25 Javascript
Js 正则表达式知识汇总
Dec 02 Javascript
js去除浏览器默认底图的方法
Jun 08 Javascript
简介AngularJS的HTML DOM支持情况
Jun 17 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
第一次接触神奇的Bootstrap表单
Jul 27 Javascript
JavaScript递归操作实例浅析
Oct 31 Javascript
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
React 组件转 Vue 组件的命令写法
Feb 28 Javascript
Vue全局分页组件的实现代码
Aug 10 Javascript
小程序如何支持使用 async/await详解
Sep 12 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 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
python实现的系统实用log类实例
2015/06/30 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python的IDEL增加清屏功能实例
2017/06/19 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Python读写docx文件的方法
2018/05/08 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
2015年惩防体系建设工作总结
2015/05/22 职场文书
校园安全主题班会
2015/08/12 职场文书
2016年春节问候语
2015/11/11 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python