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

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没有被修改,所以引用类型是按照值传递的。我在这里疑惑了很久,以下是我的理解。

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

画个图来假设理解:

原文地址:https://www.cnblogs.com/mandymm/p/13977113.html