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 相关文章推荐
utf8的编码算法 转载
Dec 27 Javascript
jQuery弹出层插件简化版代码下载
Oct 16 Javascript
javascript创建函数的20种方式汇总
Jun 23 Javascript
浅析Bootstrip的select控件绑定数据的问题
May 10 Javascript
jQuery获取单击节点对象的方法
Jun 02 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
Apr 11 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
JavaScript RegExp 对象用法详解
Sep 24 Javascript
高效jQuery选择器的5个技巧实例分析
Nov 26 jQuery
用VsCode编辑TypeScript的实现方法
May 07 Javascript
JavaScript如何实现防止重复的网络请求的示例
Jan 28 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 快速生成 Flash 动画的方法
2007/03/06 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
如何在Django项目中引入静态文件
2019/07/26 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
高中生的自我鉴定范文
2014/01/24 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
2014年个人总结范文
2015/03/09 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js