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 调试器简介
Feb 21 Javascript
JS拖动技术 关于setCapture使用
Dec 09 Javascript
jquery中文乱码的多种解决方法
Jun 21 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
Dec 08 Javascript
javascript数组去重常用方法实例分析
Apr 11 Javascript
react-router v4如何使用history控制路由跳转详解
Jan 09 Javascript
Vue2.0 实现单选互斥的方法
Apr 13 Javascript
利用vscode调试编译后的js代码详解
May 14 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 Javascript
利用jsonp解决js读取本地json跨域的问题
Dec 11 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
JavaScript实现移动端拖动元素
2020/11/24 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
python中split方法用法分析
2015/04/17 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
python实现飞机大战项目
2020/03/11 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
汇科协同Java笔试题
2012/03/31 面试题
体育之星事迹材料
2014/05/11 职场文书
和谐社区口号
2014/06/19 职场文书
明星员工获奖感言
2014/08/14 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers