对于“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指针地址一样指向数字0x = 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]的别名了。

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

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

转载于:https://www.cnblogs.com/arliang/p/Arguments_Passing_ByVal_or_ByRef_in_JavaScript.html

JavaScript 函数参数是传值(byVal)还是传址(byRef)?相关推荐

  1. 【 C 】函数参数通过传值调用还是传址调用?

    C 函数的所有参数均以 "传值调用" 方式进行传递,这意味着函数将获得参数值的一份拷贝.这样函数就可以放心修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数. 既然调用函数 ...

  2. 简单了解函数的传值调用与传址调用(C语言)

    一.首先需要引入函数中的实际参数与形式参数 实际参数(实参)是指真实传给函数的参数.实参可以是常量.变量.表达式.函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值 ...

  3. 前端:JS/22/函数(函数的概念,函数的定义格式,函数定义格式的说明,函数的调用,函数的参数),全局变量和局部变量,拷贝传值和引用传址,匿名函数,二维数组,对象,自定义对象的创建

    函数 1,函数的概念 函数,是将一段公共的代码进行封装,给它起个名字叫"函数" 函数可以一次定义,多次调用:函数可以将常用的功能代码,进行封装,如:用户名的验证,验证码函数,邮箱验 ...

  4. JavaScript 函数参数

    JavaScript 函数参数 JavaScript 函数对参数的值没有进行任何的检查. 函数显式参数(Parameters)与隐式参数(Arguments) functionName(paramet ...

  5. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

  6. 深入理解javascript函数参数

    arguments javascript对参数要求很随意,她才不管你传进来的参数是什么数据类型,甚至可以不传参数.实际上,javascript函数调用甚至不检查传入形参的个数. 1 function ...

  7. javascript函数参数的传递问题

    在javascript中数组是引用传递的.先来看一段代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...

  8. 函数的调用(传值调用和传址调用)

    传值调用 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参. 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式. 这种传参方式可以让函数和函数外边的变量建 ...

  9. 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)

    目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...

最新文章

  1. 用python创建一个目录
  2. Feature Selection Techniques
  3. 寿光农商行计算机机房,寿光农商银行 举办2021年新员工入职仪式
  4. 如果MySQL引起CPU消耗过大,你会怎么优化?
  5. python画动态图代码-Python使用matplotlib画动态图
  6. java中有hash集合_Java(1.8)集合类中的HashMap
  7. 【面试锦囊】14种模式搞定面试算法编程题(1-7)
  8. 通过Url网络编程实现下载
  9. linux怎么安装32电脑上,linux – 如何在Ubuntu上安装mingw32?
  10. 教你正确把加减乘除运用在MySQL里面
  11. Python 调试冷知识
  12. GitHub 被指审查内容,著名“换脸”开源项目 deepfake 遭限制访问
  13. 51单片机汇编语言指令汇总
  14. 超级跳台阶的动态规划实现
  15. 手机实名检测 API数据接口
  16. windows10 安装office2021(预装正版)经验分享
  17. IDEA如何在包下面继续建包
  18. 4.6 案例10 使用QList处理数据集
  19. 浏览器是如何验证HTTPS证书合法性的?
  20. CUDA C++基本写法

热门文章

  1. python求两个数的最大值、用带参函数实现_Python有参函数使用代码实例
  2. stretchblt 模糊_微软开源持续开发模糊测试工具OneFuzz
  3. 系统学习机器学习之特征工程(三)--稀疏特征之FM算法
  4. 三维计算机视觉(四)--关键点
  5. OpenCV系统学习(基本了解完)
  6. 汇编学习--7.10--程序编写
  7. golang实现文件服务器,【Golang】实现文件服务器断点续传
  8. 【Java程序设计】流程控制
  9. idea报错命令行过长
  10. nearly,about,almost的区别