深入理解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 特殊字符
Apr 05 Javascript
JS定时器实例详细分析
Oct 11 Javascript
Google 地图叠加层实例讲解
Aug 06 Javascript
Bootstrap文件上传组件之bootstrap fileinput
Nov 25 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
js截取字符串功能的实现方法
Sep 27 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 jQuery
js中let和var定义变量的区别
Feb 08 Javascript
详解微信小程序的 request 封装示例
Aug 21 Javascript
vue项目中实现的微信分享功能示例
Jan 21 Javascript
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
vue项目打包后路由错误的解决方法
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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
jQuery 动画基础教程
2008/12/25 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python注释详解
2016/06/01 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
Python进行统计建模
2020/08/10 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
教师绩效考核方案
2014/01/21 职场文书
违反交通法规检讨书
2014/09/10 职场文书
民主生活会意见
2015/06/05 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python