资讯专栏INFORMATION COLUMN

JavaScript参数传递方式

jcc / 754人阅读

这几天遇到js参数传递方式的问题,深切探究一番,将所得结果总结于此

常见的几种传递方式 传值调用(call by value)
在传值调用中实际参数被求值,其值被绑定到函数中对应的变量上(通常是把值复制到新内存区域)。在函数返回后调用者作用域里的曾传给函数的任何东西都不会变。
传引用调用(call by reference)
在“传引用调用”求值中,传递给函数的是它的实际参数的隐式引用(即实际参数的地址)而不是实参的拷贝。通常函数能够修改这些参数(比如赋值),而且改变对于调用者是可见的。
传共享对象调用(call by sharing)
在传共享对象调用中,传递给函数的是实参所指向引用对象的地址,而不是实参的地址,即传递共享对象。故在函数中修改引用对象时,实参的值也会跟着变化,而如果是重新给新参赋值后,再进行任何修改都不会影响到外面的实参了。
JS中的传值方式 Number--传值调用
let a = 1;
function add(val) {
  val += 1;
  console.log(`val=${val}`); // 2
}

add(a);
console.log(`a=${a}`); // 1
String--传值调用
let a = "hahaha";
function change(val) {
  val = "heiheihei";
  console.log(`val=${val}`); // heiheihei
}

change(a);
console.log(`a=${a}`); // hahaha
Boolean--传值调用 Symbol--传值调用
let a = Symbol("prop");
function change(val) {
  val = Symbol(2);
  console.log(`val=${val.toString()}`); // Symbol(2)
}

change(a);
console.log(`a=${a.toString()}`); // Symbol(prop)
null--传值调用 undefined--传值调用 Object--传共享对象调用
let obj = {
    a: 1
}
function change(obj) {
    obj.a = 2;
    console.log(obj); // {a: 2}
    obj = {
        a: 3
    }
    console.log(obj); // {a: 3}
}

change(obj);
console.log(obj); // {a: 2}

从上面的代码可以看出,在函数中对参数所指向的对象进行修改时会影响到外面的实参,但对函数参数重新赋值时,不会影响到实参,故js引用类型的传值方式为call by sharing

深入探究 变量存储方式

C#中类型有两种:值类型和引用类型,它们之间的却别在于实际数据存储的位置(如上图)。值类型的变量和实际数据都存储在堆栈中;而引用类型则只有变量存储在堆栈中,变量存储着实际数据的地址,实际数据存储在与地址相对应的托管堆中。

C#中的值传递

正常情况下,值类型按值传递

正常情况下,应用类型按共享对象的方式传递(call by sharing),但string类型除外(由于string的不可变性,它是按值传递的)

通过使用ref或out关键字,值类型和引用类型都可以按引用传递

总结

综上所述(证明题2333),值传递和引用传递的参数类型既可以是值类型又可以是引用类型,但是call by sharing的参数类型只能是引用类型。

个人理解:JS中,null赋值的变量时对象,但是,变量指向的引用地址为空,故在函数中修改参数的值,对实参不会又任何影响,所以是按值传递。string类型应该跟C#按值传递的原因一致。

参考:
维基百科
JS中的值是按值传递,还是按引用传递呢
《Learning hard C#学习笔记》第10章

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108413.html

相关文章

  • JavaScript深入之参数按值传递

    摘要:深入系列第九篇,除了按值传递引用传递,还有第三种传递方式按共享传递定义在高级程序设计第三版,讲到传递参数中所有函数的参数都是按值传递的。 JavaScript深入系列第九篇,除了按值传递、引用传递,还有第三种传递方式 —— 按共享传递 定义 在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数: ECMAScript中所有函数的参数都是按值传递的。 什么是按值传递呢?...

    DataPipeline 评论0 收藏0
  • 图解JavaScript参数传递

    摘要:写在最前本次尝试通过流程图的形式并结合两个例子来重新理解一下中的参数传递。欢迎关注我的博客,不定期更新中参数到底如何传递借用红宝书的一句话中所有函数的参数都是按值传递的这个值如果是简单类型,那么就是其本身。同时执行第一个结果即为。 写在最前 本次尝试通过流程图的形式并结合两个例子来重新理解一下JavaScript中的参数传递。 欢迎关注我的博客,不定期更新中—— 参数到底如何传递? 借...

    Berwin 评论0 收藏0
  • JavaScript函数式编程(0):函数基础 arguments、this、apply()、cal

    摘要:参数引用函数的上下文,函数上下文来自于等面向对象语言,中的依赖于函数声明。没有重载函数没有签名,因为其参数是由包含零或多个值的数组来表示的。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。 1 函数参数 函数的实参和形参个数可以不等,之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪...

    陈伟 评论0 收藏0
  • JavaScript函数式编程(0):函数基础 arguments、this、apply()、cal

    摘要:参数引用函数的上下文,函数上下文来自于等面向对象语言,中的依赖于函数声明。没有重载函数没有签名,因为其参数是由包含零或多个值的数组来表示的。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。 1 函数参数 函数的实参和形参个数可以不等,之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪...

    liuchengxu 评论0 收藏0
  • 混合应用中的javascript实践

    摘要:混合应用在几年前便进入大众视野,近来更是越发风生水起,深受人民群众的喜爱。混合方式如同茴字有几种写法一般,构建混合应用也有不同的方式。机型则会比较悲剧,使用方案或许是个正确的选择。所以在开发中一定要做好可用性检测,减少出现的几率。 混合应用(hybird app) 在几年前便进入大众视野,近来更是越发风生水起,深受人民群众的喜爱。 概念 什么是混合应用 混合应用(hybird app)...

    Flink_China 评论0 收藏0

发表评论

0条评论

jcc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<