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 相关文章推荐
JS代码同步文本框内容的实例方法
Jul 12 Javascript
超级好用的jQuery圆角插件 Corner速成
Aug 31 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
js给table赋值的实例代码
Oct 13 Javascript
yarn与npm的命令行小结
Oct 20 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
JS中的phototype详解
Feb 04 Javascript
利用n工具轻松管理Node.js的版本
Apr 21 Javascript
微信小程序websocket实现即时聊天功能
May 21 Javascript
JS数组中对象去重操作示例
Jun 04 Javascript
浅探express路由和中间件的实现
Sep 30 Javascript
JavaScript函数重载操作实例浅析
May 02 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 验证码制作(网树注释思想)
2009/07/20 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
vue使用video插件vue-video-player详解
2020/10/23 Javascript
python的id()函数解密过程
2012/12/25 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
Python操作csv文件实例详解
2017/07/31 Python
Python zip()函数用法实例分析
2018/03/17 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Django框架安装方法图文详解
2019/11/04 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
单位委托书范本
2014/04/04 职场文书
采购部长岗位职责
2014/06/13 职场文书
交通违章检讨书
2014/09/21 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
如何解决.cuda()加载用时很长的问题
2021/05/24 Python