深入理解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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
Jan 15 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
Oct 21 Javascript
JS正则中的RegExp对象对象
Nov 07 Javascript
JavaScript避免内存泄露及内存管理技巧
Sep 05 Javascript
理解javascript中的严格模式
Feb 01 Javascript
AngularJs 指令详解及示例代码
Sep 01 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
Sep 09 Javascript
ES6概念 Symbol toString()方法
Dec 25 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
Vue指令指令大全
Feb 09 Javascript
ES6之Proxy的get方法详解
Oct 11 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
我的论坛源代码(三)
2006/10/09 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
Android面试题附答案
2014/12/08 面试题
建筑毕业生自我鉴定
2013/10/18 职场文书
酒吧总经理岗位职责
2013/12/10 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
2019 入党申请书范文
2019/07/10 职场文书
导游词之无锡唐城
2019/12/12 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
总结高并发下Nginx性能如何优化
2021/11/01 Servers
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python