深入理解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 相关文章推荐
JS计算网页停留时间代码
Apr 28 Javascript
利用jQuery实现可以编辑的表格
May 26 Javascript
Javascript获取当前时间函数和时间操作小结
Oct 01 Javascript
js制作简易年历完整实例
Jan 28 Javascript
jQuery搜索同辈元素方法
Feb 10 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 Javascript
DatePickerDialog 自定义样式及使用全解
Jul 09 Javascript
Angular8 简单表单验证的实现示例
Jun 03 Javascript
小程序表单认证布局及验证详解
Jun 19 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
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 选项及相关信息函数库
2006/12/04 PHP
win7+apache+php+mysql环境配置操作详解
2013/06/10 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python中super的用法实例
2015/05/28 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
python之PyMongo使用总结
2017/05/26 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
python内置模块collections知识点总结
2019/12/19 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
python打包生成so文件的实现
2020/10/30 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
软件测试常见笔试题
2012/02/04 面试题
电大自我鉴定
2013/10/27 职场文书
2014年财政局工作总结
2014/12/09 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书