深入理解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 replace方法与正则表达式
Feb 19 Javascript
老鱼 浅谈javascript面向对象编程
Mar 04 Javascript
juqery 学习之三 选择器 可见性 元素属性
Nov 25 Javascript
非主流的textarea自增长实现js代码
Dec 20 Javascript
js关闭模态窗口刷新父页面或跳转页面
Dec 13 Javascript
js实现点击链接后延迟3秒再跳转的方法
Jun 05 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
node.js操作mysql简单实例
May 25 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
js实现简单掷骰子效果
Oct 24 Javascript
react使用CSS实现react动画功能示例
May 18 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过滤危险html代码的函数
2008/07/22 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
js实现星星打分效果
2020/07/05 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
pandas参数设置的实用小技巧
2020/08/23 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
linux面试题参考答案(6)
2014/08/29 面试题
超市端午节活动方案
2014/01/23 职场文书
小学科学教学反思
2014/01/26 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
2015年基建工作总结范文
2015/05/23 职场文书