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-世界上误解最深的语言分析
Aug 12 Javascript
TopList标签和JavaScript结合两例
Aug 12 Javascript
上传的js验证(图片/文件的扩展名)
Apr 25 Javascript
jQuery中prepend()方法用法实例
Dec 25 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
js获取iframe中的window对象的实现方法
May 20 Javascript
在vue中获取dom元素内容的方法
Jul 10 Javascript
解决vue2中使用axios http请求出现的问题
Mar 05 Javascript
vue组件与复用详解
Apr 08 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
Jul 21 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 Javascript
js实现详情页放大镜效果
Oct 28 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中OR与|| AND与&&的区别总结
2013/10/26 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
php获取错误信息的方法
2015/07/17 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
python向图片里添加文字
2019/11/26 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
代码总结Python2 和 Python3 字符串的区别
2020/01/28 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
python tqdm库的使用
2020/11/30 Python
python 基于opencv实现图像增强
2020/12/23 Python
营销人才自我鉴定范文
2013/12/25 职场文书
学校搬迁方案
2014/06/15 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
医生辞职信范文
2015/03/02 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
nginx反向代理时如何保持长连接
2021/03/31 Servers
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python