深入理解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实例教程(19) 使用HoTMetal(6)
Dec 23 Javascript
简单实用的js调试logger组件实现代码
Nov 20 Javascript
js防止表单重复提交实现代码
Sep 05 Javascript
javascript的内存管理详解
Aug 07 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
PHP+jQuery+Ajax实现多图片上传效果
Mar 14 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
解决jquery有正确返回值但不执行success函数的问题
Aug 20 jQuery
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
Sep 27 Javascript
原生JS封装拖动验证滑块的实现代码示例
Jun 01 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
angular分页指令操作
2017/01/09 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
react redux入门示例
2018/04/19 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
类的核心特性有哪些
2014/01/01 面试题
幼教求职信
2014/03/12 职场文书
《搭石》教学反思
2014/04/07 职场文书
村抢险救灾方案
2014/05/09 职场文书
法院授权委托书格式
2014/09/28 职场文书
事业单位年度考核评语
2014/12/31 职场文书
介绍信格式
2015/01/30 职场文书
公积金贷款承诺书
2015/04/30 职场文书
政协常委会议主持词
2015/07/03 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书