深入理解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 相关文章推荐
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
Aug 28 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
Nov 14 Javascript
使用jQuery将多条数据插入模态框的实现代码
Oct 08 Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 Javascript
jQuery中 prop() attr()使用详解
May 19 Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
vue绑定class与行间样式style详解
Aug 16 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
Layui实现带查询条件的分页
Jul 27 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
Sep 10 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数组删除元素示例
2014/03/21 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
python多线程用法实例详解
2015/01/15 Python
Python中__name__的使用实例
2015/04/14 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
商场中秋节活动方案
2014/02/07 职场文书
分家协议书
2014/04/21 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
南京南京观后感
2015/06/02 职场文书
运动员入场词
2015/07/18 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
Python基本数据类型之字符串str
2021/07/21 Python