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 相关文章推荐
jQuery初学:find()方法及children方法的区别分析
Jan 31 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
js实现按Ctrl+Enter发送效果
Sep 18 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
Sep 06 Javascript
详解AngularJS controller调用factory
May 19 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
JS实现验证码倒计时的注册页面
Jan 02 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 Javascript
apicloud拉起小程序并传递参数的方法示例
Nov 21 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
Dec 22 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实现无限分类的实现方法
2016/11/14 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[01:46]新英雄登场
2019/09/10 DOTA
python不带重复的全排列代码
2013/08/13 Python
python类参数self使用示例
2014/02/17 Python
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Python中使用logging模块打印log日志详解
2015/04/05 Python
python判断完全平方数的方法
2018/11/13 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
德国购买门票网站:ADticket.de
2019/10/31 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
大学生就业推荐信范文
2013/11/29 职场文书
小学毕业感言500字
2014/02/28 职场文书
双拥工作宣传标语
2014/06/26 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
培训感想范文
2015/08/07 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
校长新学期寄语2016
2015/12/04 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
redis中lua脚本使用教程
2021/11/01 Redis