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 相关文章推荐
避免 showModalDialog 弹出新窗体的原因分析
May 31 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
Feb 16 Javascript
JS实现随机化快速排序的实例代码
Aug 01 Javascript
javascript常用功能汇总
Jul 05 Javascript
Jquery easyui 实现动态树
Nov 17 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
Oct 24 Javascript
layui弹出层按钮提交iframe表单的方法
Aug 20 Javascript
傻瓜式vuex语法糖kiss-vuex整理
Dec 21 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
May 21 Javascript
es6 for循环中let和var区别详解
Jan 12 Javascript
JavaScript进阶(三)闭包原理与用法详解
May 09 Javascript
vue 通过base64实现图片下载功能
Dec 19 Vue.js
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
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
PHP小教程之实现链表
2014/06/09 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Python 爬取携程所有机票的实例代码
2018/06/11 Python
Python退火算法在高次方程的应用
2018/07/26 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
厂长助理岗位职责
2013/12/27 职场文书
职称评定自我鉴定
2014/03/18 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
redis 解决库存并发问题实现数量控制
2022/04/08 Redis