深入理解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操作字符串的原生方法
Dec 22 Javascript
javascript结合CSS实现苹果开关按钮特效
Apr 07 Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 Javascript
jQuery实现的多滑动门,多选项卡效果代码
Mar 28 Javascript
JS控制伪元素的方法汇总
Apr 06 Javascript
BootStrap 表单控件之单选按钮水平排列
May 23 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
Jul 13 Javascript
详解webpack4.x之搭建前端开发环境
Mar 28 Javascript
vue组件之间的数据传递方法详解
Apr 19 Javascript
深入了解JavaScript 私有化
May 30 Javascript
Node.js 中判断一个文件是否存在
Aug 24 Javascript
vue使用element-ui按需引入
May 20 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
php中static静态变量的使用方法详解
2010/06/04 PHP
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
初识JQuery 实例一(first)
2011/03/16 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
Python加速程序运行的方法
2020/07/29 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
毕业证丢失证明
2014/01/15 职场文书
买房委托公证书
2014/04/08 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
安全伴我行主题班会
2015/08/13 职场文书
《全神贯注》教学反思
2016/02/22 职场文书