深入理解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 相关文章推荐
Ruffy javascript 学习笔记
Nov 30 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
关于火狐(firefox)及ie下event获取的两种方法
Dec 27 Javascript
jcrop基本参数一览
Jul 16 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
Jan 23 Javascript
jquery简单的弹出层浮动层代码
Apr 27 Javascript
基于原生JS实现图片裁剪
Aug 01 Javascript
关于微信jssdk实现多图片上传的一点心得分享
Dec 13 Javascript
详解Vue.js搭建路由报错 router.map is not a function
Jun 27 Javascript
canvas轨迹回放功能实现
Dec 20 Javascript
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
查看Django和flask版本的方法
2018/05/14 Python
python 获取字符串MD5值方法
2018/05/29 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
django删除表重建的实现方法
2019/08/28 Python
基于Django统计博客文章阅读量
2019/10/29 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
数据库笔试题
2013/05/09 面试题
2014社区三八妇女节活动总结
2014/03/01 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
2015大学迎新标语
2015/07/16 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python