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 相关文章推荐
javascript 操作cookies及正确使用cookies的属性
Oct 15 Javascript
javascript 按回车键相应按钮提交事件
Nov 02 Javascript
JavaScript中的对象序列化介绍
Dec 30 Javascript
javascript实现延时显示提示框特效代码
Apr 27 Javascript
AngularJS封装指令方法详解
Dec 12 Javascript
canvas实现图像布局填充功能
Feb 06 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
Sep 19 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
Oct 16 Javascript
深入理解ES6之数据解构的用法
Jan 13 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
JS几个常用的函数和对象定义与用法示例
Jan 15 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生成静态页面详解
2006/12/05 PHP
php使用百度天气接口示例
2014/04/22 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
微信小程序保持session会话的方法
2020/03/20 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
django+mysql的使用示例
2018/11/23 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
python模块常用用法实例详解
2019/10/17 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
优秀党员转正的自我评价
2013/10/06 职场文书
公务员职务工作的自我评价
2013/11/01 职场文书
个人近期表现材料
2014/02/11 职场文书
安全例会汇报材料
2014/08/23 职场文书
三方股份合作协议书
2014/10/13 职场文书
2014年就业工作总结
2014/11/26 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
python中mongodb包操作数据库
2022/04/19 Python