深入理解JavaScript中的传值与传引用


Posted in Javascript onDecember 09, 2013

1.传值(by value)

变量的值被复制出一份,与原来的值将不相干,也就是说即使新的值被修改,原来的值也不会改变,在JavaScript中基本类型都是传值的.

function testPassValue()
{
   var m=1;
   var n=2;
   //将m,n的值复制一份,传递到passValue
   passValue(m,n);
   alert(m);  //将是原有的值
}
function passValue(a,b)
{
  a = a+b; //改变a的值,这里a只是原有值的一份copy
  alert(a);  
}

输出结果:
3

1

2.传引用(by reference).

引用本身复制一份传给function,引用指向的对象并没有被复制传递(java中也是如此),在function中,如果改变了对象的属性的值,由于和原来的引用指向的是同一个对象,因此在通过原来的引用访问到的将是修改过的值;

但是如果只是在function中将引用指向一个新的对象,将不会改变原对象的值,改变的只是复制的这一份引用.

function testPassValue()
{
  var date = new Date(2006,02,27);
  alert(date.getDate());  //输出为 27
  //将date引用本身复制一份,传递到passReference,注意date所指向的对象并没有被复制
  passReference(date);
  alert(date.getDate());  //输出为12
  //同上
  changeReference(date);
  alert(date.getDate());  //输出还为12
}
function passReference(da)
{
 //由于da和原引用指向的是同一个对象,在function外,通过原有的引用访问到的将是对象的日期属性值,将是修改之后的值.
   da.setDate(12); 
}
function changeReference(da)
{
   //此时da引用实际上是原引用的一份copy,将引用本身重新赋值,将不会影响原引用
   da= new Date(2007,05,11); 
//将da引用指向一个新的对象,此时原引用指向的还是原来的对象
   alert(da.getDate());     // 输出为11
}

3 特殊的String 

在JavaScript中,String也传引用的. js中只有charAt方法,而没有对应的修改方法,和java中的String相同,都具有不变性.

var s1 = "hello";
var s2 = "hell" + "o";
if (s1 == s2)   
alert("s1 = s2");  //这句会不会执行? java用的熟的人可能会认为不会执行(这句话我颇有微词,java中也是会执行的!),因为java中的==比较的是同一性. 事实上在js中对String==比较的是值是否相等,所以这句话会执行. 但是对其他的Object == 比较和java中一样是同一性.
Javascript 相关文章推荐
JavaScript面向对象之体会[总结]
Nov 13 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
Aug 14 Javascript
Javasipt:操作radio标签详解
Dec 30 Javascript
jquery map方法使用示例
Apr 23 Javascript
jquery加载图片时以淡入方式显示的方法
Jan 14 Javascript
javaScript实现可缩放的显示区效果代码
Oct 26 Javascript
解析javascript瀑布流原理实现图片滚动加载
Mar 10 Javascript
prototype.js常用函数详解
Jun 18 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
Aug 27 Javascript
AngularJS extend用法详解及实例代码
Nov 15 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
Jan 14 Javascript
详细分析Node.js 多进程
Jun 22 Javascript
js Array操作的最简短最容易理解方法
Dec 09 #Javascript
javascript放大镜效果的简单实现
Dec 09 #Javascript
javascript贪吃蛇完整版(源码)
Dec 09 #Javascript
关于js内存泄露的一个好例子
Dec 09 #Javascript
JS连连看源码完美注释版(推荐)
Dec 09 #Javascript
解析Javascript中难以理解的11个问题
Dec 09 #Javascript
深入理解Javascript作用域与变量提升
Dec 09 #Javascript
You might like
PHP入门速成(2)
2006/10/09 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
php实现生成验证码实例分享
2016/04/10 PHP
php常用的工具开发整理
2019/09/26 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
Python中的闭包总结
2014/09/18 Python
Django URL传递参数的方法总结
2016/08/28 Python
python如何制作英文字典
2019/06/25 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
python 如何将office文件转换为PDF
2020/09/22 Python
python ssh 执行shell命令的示例
2020/09/29 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
html5时钟实现代码
2010/10/22 HTML / CSS
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
医学专业应届生的自我评价
2014/02/28 职场文书
档案信息化建设方案
2014/05/16 职场文书
就职演讲稿范文
2014/05/19 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年财政局工作总结
2014/12/09 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
行政复议答复书
2015/07/01 职场文书
领导欢送会主持词
2015/07/06 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang