理解按值传递和按引用传递

Posted mandymm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解按值传递和按引用传递相关的知识,希望对你有一定的参考价值。

1.基本类型和引用类型的值

  • 基本数据类型:Number、String、Boolean、Null、Undefined,这些数据类型按值访问,可以直接操作保存在变量中的实际值。
  • 引用数据类型:Object有多个值构成的对象。按照指针访问存在堆内存中的值。

2.复制变量值

基本数据的复制,将原先变量的基本数据类型的值复制给新变量,两者不会影响。

var num = 1;
var num1 = num2;
console.log(num1,num2); // 1 1
num1 = 2;
console.log(num1,num2);// 2 1

引用数据类型的值,将原先变量的指针复制给新变量,两个变量指向同一个引用类型的值,所以任何一个被修改,都会影响值的改变。

var person = new Object();
person.name = bobo;
var obj = person;
obj.name = daytoy;
console.log(person.name); // "daytoy"

2.传递参数

ECMAScript中所有的函数都是按值传递的。引用类型的值和基本类型的值,在作为函数的参数传递时都是按值传递的。

function addTen(num){
    num += 10;
    return num;
}
var count = 20;
var result = addTen(count)
console.log(count);  // 20,没有变化
console.log(result); // 30

这里相当于把count的值复制给num,按值传递,并且互不影响。

到对象作为参数的传递,可能会有些迷惑。接下来画图理解。

同样以书上的例子放代码:

function setName(obj){
        obj.name = "Nicholas"
      }
       var person = new Object()
       setName(person)
       console.log(person.name); // "Nicholas"

在这里,javascript高级程序设计中讲到,这是按值传递的结果,又举例说明为什么这里是按值传递而不是按引用传递。

function setName(obj) {
        obj.name = Nicholas;
        obj = new Object();
        obj.name = Greg;
      }
      var person = new Object();
      setName(person);
      console.log(person.name); // "Nicholas"

这个例子得到的结果是,person没有被修改,所以引用类型是按照值传递的。我在这里疑惑了很久,以下是我的理解。

  • 按值传递,就是相当于把变量的值复制一份给函数的形参,基本数据类型的变量值就是实际的值,引用类型的变量值是引用的对象地址,所以传递的值也是地址。
  • 按引用传递,就是把变量的地址给到形参,形参接收的不是变量的值,而是地址。

画个图来假设理解:

技术图片

 

技术图片

 

以上是关于理解按值传递和按引用传递的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 REF 和 OUT 关键字与按引用传递和按值传递一起使用

Python按值传递参数和按引用传递参数

Java的按值传递和按引用传递解说

关于php按值传递和按引用传递问题

按引用传递然后复制和按值传递在功能上是不是不同?

(转)Java:按值传递和按引用传递详细解说