美文网首页
按值传递、按引用传递、按共享传递

按值传递、按引用传递、按共享传递

作者: amenema | 来源:发表于2019-06-05 12:00 被阅读0次

按值传递、按引用传递、按共享传递

按值传递(call by value

按值传递,就是指在调用函数时,将实参对应的值做一个拷贝指向函数对应的形参。在函数内改变形参对应的值并不会影响外部实参的值。

按引用传递 (call by reference)

按引用传递,是指在调用函数时,传递给函数的是实参的地址即引用,而不是实参的拷贝。在函数内部参数的值,对外部的实参是可见的。

按共享传递 (call by sharing

按共享传递,是指在调用函数时,传递给函数的是实参的地址的拷贝(如果实参在栈中,则直接拷贝该值)。在函数内部对参数进行操作时,需要先拷贝的地址寻找到具体的值,再进行操作。如果该值在栈中,那么因为是直接拷贝的值,所以函数内部对参数进行操作不会对外部变量产生影响。如果原来拷贝的是原值在堆中的地址,那么需要先根据该地址找到堆中对应的位置,再进行操作。因为传递的是地址的拷贝所以函数内对值的操作对外部变量是可见的。

按共享传递可以理解为按值传递的一个特例,这里的值是对象的引用地址,而不是具体对象。

举例


var a = 1
var b = 2
function change(x, y) {
  var z = x
  x = y
  y = z
  console.log('a = ' + x + ' , b = ' + y)
}
change(a, b)
console.log('a = ' + a + ' , b = ' + b)
//因为是传值调用所以函数内部操作并未影响外部变量


var o1 = {name: 'Tom'}
function changeObj(o) {
  o.name = 'Lucy'
  console.log('name is : ' + o.name)
  o = {name: 'Eve'}
  console.log('name is : ' + o.name)
}
changeObj(o1)
console.log('name is: ' + o1.name)
//因为是按共享传递调用。所以如果是修改对象的值,对外部可见。但是当将形参的引用指向闲的对象时,由于该引用是一个原引用的拷贝,所以并未影响到原对象。

参考

  1. wikipedia:求值策略

相关文章

  • JS是按值传递还是按引用传递?

    JS是按值传递还是按引用传递? 按值传递 VS. 按引用传递 探究JS值的传递方式 按共享传递 call by s...

  • 再学JS--函数参数传递类型

    JavaScript的函数参数传递分为按值传递、按引用传递以及按共享传递。 按值传递 什么是按值传递? 把函数外部...

  • 按值传递、按引用传递、按共享传递

    按值传递、按引用传递、按共享传递 按值传递(call by value) 按值传递,就是指在调用函数时,将实参对应...

  • 参数按值传递

    参数如果是基本类型是按值传递,如果是引用类型按共享传递。 1、按值传值 2、共享传值 共享传值: 按引用传递是传...

  • JavaScript深入之参数按值传递

    除了按值传递、引用传递,还有第三种传递方式 —— 按共享传递(JS应该是共享传递,没有所谓的引用传递) 共享传递是...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

  • 方法参数

    一、参数传递 1.参数传递有两种类型:按值传递和按引用传递。 2.按值传递指变量使用的是参数传递的值,而按引用传递...

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

  • Java值传递

    “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值...

  • 按值传递与按引用传递

    按值传递 -- 传递的是参数的值,即参数本身。 按引用传递 -- 传递的是指向参数的值的引用(指针),而不是参数的...

网友评论

      本文标题:按值传递、按引用传递、按共享传递

      本文链接:https://www.haomeiwen.com/subject/ysvjxctx.html