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


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

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

    画个图来假设理解:

  • 相关阅读:
    快速读取数字
    std:ios:sync_with_stdio (false)以及局限性
    差分,差分数组
    归并排序
    2020-07-06日报博客
    OAuth2-授权码模式 登录流程
    OAuth2 简介
    SpringSecurity连接数据库
    SpringSecurity中的授权
    SpringSecurity 入门
  • 原文地址:https://www.cnblogs.com/mandymm/p/13977113.html
Copyright © 2020-2023  润新知