JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享


Posted in Javascript onJuly 02, 2013

对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object, Array等“复杂类型”是传址。
这样不对吗?为什么会有这样的误区?看一下这两段代码:

//造成传值假象的代码
function modifyLikeByVal(x){
  x = 1;
  console.log('x = %d', x);
}
var x = 0;
console.log('x = %d', x); // 输出 x = 0
modifyLikeByVal(x);  // 输出 x = 1
console.log('x = %d', x); // 输出 x = 0   x没变!

//造成传址假象的代码
function modifyLikeByRef(x){
  x[0] = 4;
  x[1] = 5;
  x[2] = 6;
  console.log('x = [ %s ]', x.join(', '));
}
var x = [1, 2, 3];
console.log('x = [ %s ]', x.join(', ')); // 输出 x = [ 1, 2, 3 ]
modifyLikeByRef(x);  // 输出 x = [ 4, 5, 6 ]
console.log('x = [ %s ]', x.join(', ')); // 输出 x = [ 4, 5, 6 ]   x变了!

于是,由以上代码得出结论,“简单类型”作为参数是传值(byVal)的,“复杂类型”作为参数是传址(byRef)的。

问题出在哪呢?

仔细观察两个函数,就可以发现一点:
在byVal中,是直接修改了参数x: x = 1;
而byRef中,是修改参数x的成员: x[0] = 4; x[1] = 5; x[2] = 6;

本人由此得出猜想:在JavaScript中,所有的变量或成员,都是一个指针,在修改变量或成员值的时候,其实是修改了该指针的地址。

这样上面的代码就可以得到解释了:

在“byVal”中:

global {  // 表示全局作用域,下面的表示函数作用域
  var x = 0;  // 初始化指针x并指向数字0
    fun(x) {
      x = global.x; // 传入参数global.x; fun域的x指针地址与global域的x指针地址一样指向数字0
      x = 1; // 修改fun域的x指针地址,指向数字1;
    } // fun 域结束,global域中的x指针没改变
}

在“byRef”中:
global {  // 表示全局作用域,下面的表示函数作用域
  /*
    初始化指针x并指向数组[1, 2, 3]
    其实是x的三个成员0, 1, 2,分别指向1, 2, 3;
  */
  var x = [1, 2, 3];  
    fun(x) {
      x = global.x; // 传入参数global.x; fun域的x指针地址与global域的x指针地址一样指向数组[1, 2, 3]
      /*
       在fun域中的x没有再被改变
       紧接着修改fun域中的x(也就是global.x)三个成员指针的指向
      */
      x[0] = 4;
      x[1] = 5;
      x[2] = 6;
    } // fun 域结束,global域中的x指针没改变,但其三个成员指针被改变了,于是就看到我们输出的结果
}

那这段代码怎么解释呢???
(function(a, b){
    arguments[0] = 1;
    b = 2;
    console.log(arguments, a, b);
})(-1, -2);

只能说a, b...,是arguments[0],...[n]的别名了。

如果有不对的地方,请指出来,谢谢。

如果有更好的解释,欢迎大家分享。

Javascript 相关文章推荐
javascript实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
JS 类型转换常见方法小结
May 31 Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
JavaScript中的console.dir()函数介绍
Dec 29 Javascript
如何屏蔽防止别的网站嵌入框架代码
Aug 24 Javascript
jquery可定制的在线UEditor编辑器
Nov 17 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
纯js实现画一棵树的示例
Sep 05 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
vue最简单的前后端交互示例详解
Oct 11 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
Mar 19 Javascript
Canvas三种动态画圆实现方法说明(小结)
Apr 16 Javascript
js创建子窗口并且回传值示例代码
Jul 02 #Javascript
封装html的select标签的js操作实例
Jul 02 #Javascript
使用js获取地址栏中传递的值
Jul 02 #Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
Jul 01 #Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 #Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
Jul 01 #Javascript
原生javascript兼容性测试实例
Jul 01 #Javascript
You might like
常用PHP框架功能对照表
2014/10/23 PHP
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
用python实现对比两张图片的不同
2018/02/05 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
Django中使用Celery的教程详解
2018/08/24 Python
python3.x实现base64加密和解密
2019/03/28 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
毕业生的自我评价
2013/12/30 职场文书
企业指导教师评语
2014/04/28 职场文书
建筑节能汇报材料
2014/08/22 职场文书
旅游项目合作意向书
2015/05/08 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
Python字符串格式化方式
2022/04/07 Python