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 相关文章推荐
Jquery 表单取值赋值的一些基本操作
Oct 11 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
Apr 18 Javascript
浅析document.ready和window.onload的区别讲解
Dec 18 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
修改vue+webpack run build的路径方法
Sep 01 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
Sep 19 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
Apr 16 jQuery
javascript随机变色实例代码
Oct 15 Javascript
浅谈JSON5解决了JSON的两大痛点
Dec 14 Javascript
vue+springboot实现登录验证码
May 27 Vue.js
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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
NOT NULL 和NULL
2007/01/15 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
普通PHP程序员笔试题
2016/01/01 面试题
"火柴棍式"程序员面试题
2014/03/16 面试题
什么是GWT的Module
2013/01/20 面试题
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
学习两会精神心得范文
2014/03/17 职场文书
还款承诺书范文
2014/05/20 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书