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 数组排序函数
Aug 20 Javascript
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
jQuery 自动增长的文本输入框实现代码
Apr 02 Javascript
js仿百度有啊通栏展示效果实现代码
May 28 Javascript
jquery中load方法的用法及注意事项说明
Feb 22 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
Oct 10 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
微信小程序实现倒计时补零功能
Jul 09 Javascript
JavaScript函数的4种调用方法实例分析
Mar 05 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
Sep 29 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
js实现列表向上无限滚动
Jan 13 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/10/09 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
js闭包学习心得总结
2018/04/17 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
让 python 命令行也可以自动补全
2014/11/30 Python
Python之str操作方法(详解)
2017/06/19 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python内置加密模块用法解析
2019/11/25 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
班主任对学生的评语
2014/04/26 职场文书
优质服务演讲稿
2014/05/14 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
Mysql开启外网访问
2022/05/15 MySQL