zoukankan      html  css  js  c++  java
  • JavaScript是按引用传递or值传递?

    今遇js基础类型等问题,已经有点模糊,遂作总结。

    前言:

    JavaScript原始类型:Undefined、Null、Boolean、Number、String、Symbol JavaScript引用类型:Object;

    原始类型又被称为基本类型,原始类型保存的变量和值直接保存在栈内存(Stack)中,且空间相互独立,通过值来访问;虽然原始类型的值是储存在相对独立空间,但是它们之间的比较是按值比较的;

    引用类型即Object 类型,再往下细分,还可以分为:Object 类型、Array 类型、Date 类型、Function 类型 等。与原始类型不同的是,引用类型的内容是保存在堆内存中,而栈内存(Heap)中会有一个堆内存地址,通过这个地址变量被指向堆内存。

    1.JavaScript中的基本类型传递

    一个我们经常遇到的问题:“JS中的值是按值传递,还是按引用传递呢?”

    由于js中存在复杂类型和基本类型,对于基本类型而言,是按值传递的.

    var a = 1;
    function test(x) {
      x = 10;
      console.log(x);
    }
    test(a); // 10
    console.log(a); // 1

    虽然在函数testa被修改,并没有有影响到 外部a的值,基本类型是按值传递的.


    2.复杂类型按引用传递?

    我们将外部a作为一个对象传入test函数.

    var a = {
      a: 1,
      b: 2
    };
    function test(x) {
      x.a = 10;
      console.log(x);
    }
    test(a); // { a: 10, b: 2 }
    console.log(a); // { a: 10, b: 2 }

    可以看到,在函数体内被修改的a对象也同时影响到了外部的a对象,可见复杂类型是按引用传递的.

    可是如果再做一个实验:

    var a = {
      a: 1,
      b: 2
    };
    function test(x) {
      x = 10;
      console.log(x);
    }
    test(a); // 10
    console.log(a); // { a: 1, b: 2 }

    外部的a并没有被修改,如果是按引用传递的话,由于共享同一个堆内存,a在外部也会表现为10才对.
    此时的复杂类型同时表现出了按值传递按引用传递的特性.


    3.按共享传递

    复杂类型之所以会产生这种特性,原因就是在传递过程中,对象a先产生了一个副本a,这个副本a并不是深克隆得到的副本a,副本a地址同样指向对象a指向的堆内存.

    因此在函数体中修改x=10只是修改了副本a,a对象没有变化. 但是如果修改了x.a=10是修改了两者指向的同一堆内存,此时对象a也会受到影响.

    有人讲这种特性叫做传递引用,也有一种说法叫做按共享传递.

  • 相关阅读:
    hdu--4487--dp
    gitLab重新配置ssh
    图片在DIV中垂直居中的显示方法
    Git教程学习 -- 第六篇 标签管理
    Git教程学习 -- 第五篇 Bug分支
    Git教程学习 --第四篇 分支管理
    Git 教程学习--第三篇
    Git 教程学习--第二篇
    Git 教程学习--第一篇
    动态修改title标题
  • 原文地址:https://www.cnblogs.com/xiongzuyan/p/10399848.html
Copyright © 2011-2022 走看看