美文网首页
2023-03-03_JSDay05-基本类型和引用类型的赋值区

2023-03-03_JSDay05-基本类型和引用类型的赋值区

作者: 远方的路_ | 来源:发表于2023-03-02 21:14 被阅读0次
当我们把值赋值(=)给一个变量时,JavaScript解析器首先要做的就是确认这个变量是基本类型值还是引用类型。

在js包含两种不同的数据类型:

  • 基本类型,按值传递,相当值复制一份给另外一个变量。修改新的变量不会影响旧的

  • 引用类型,按址传递,值在传递的时候是传递内存中的堆地址给另外一个变量。修改新的变量会影响旧的

我们都知道变量是存储在内存中的,内存可以分为栈内存堆内存

  • 栈内存:主要存储基本类型的值和引用类型变量的地址。
  • 堆内存:主要存储引用类型的值。如存放对象、数组、函数的值

基本数据类型的赋值过程(值传递)

先看下面一段代码:

var a = 10;
var b = a; // b
b = 20;
console.log(b); //  20
console.log(a); //  10

解析:基本数据类型之间的赋值,都是把值复制一份赋值给另外一个变量,对原来的变量没有影响。
如下图是基本数据类型赋值的过程(值传递):

栈内存

引用数据类型赋值过程(址传递)

数组和对象都是引用数据类型,按地址传递,如下所示:
看下面一段代码:

var arr1 = [2,3];
var arr2 = arr1; //相当于把arr1的堆 地址传给变量arr2
arr2.push(4); // 向数组arr2尾部添加一个元素
console.log(arr1); // [2,3,4]  可见,arr1也会受到影响
console.log(arr2); // [2,3,4]

解析:上面的值都是小锤,因为对象是引用类型,引用类型赋值的过程,是把变量的所在内存地址赋值给另外一个变量。于是多个变量都指向都一个内存空间,对其中一个变量进行更改,会影响原来的变量。


不同数据类型的比较

  1. 基本类型比较是其值是否相等
  2. 引用类型(数组、对象、函数)比较的是他们在堆中的内存地址是否一样,如果一样,说明他们是指向同一块堆内存
        // 比较基本类型
        var a = 1;
        var b = 1;
        console.log(a === b); // true

        // 比较引用类型(数组)
        var arr1 = [1, 2, 3];
        var arr2 = [1, 2, 3];
        var arr3 = arr2
        console.log(arr1 === arr2); // false
        console.log(arr2 === arr3); // true

注意:函数也是一种引用类型,其类型是function,归属于对象的子类型。也是存在于堆内存中

var foo = function(){}
console.log( typeof foo ); // 'function'

var bar = foo; // 也是引用传递
console.log(bar === foo); // true  说明堆内存空间一样,指向同一个引用

传递引用类型的参数

如果调用函数传递的是引用类型的参数,函数内部对其修改,会影响到原变量本身。因为传递的是引用(内存地址)。

 function test(data) {
        data.push(4)
  }
  var arr = [1, 2, 3]
  // 传递引用类型,相当于把堆内存地址赋值给形参data了
  test(arr)
  console.log(arr); // [1,2,3,4]

相关文章

  • JS中容易出错的点

    基本类型和引用类型的赋值问题 上例很好地证明了:基本类型值按值传递,引用类型值按引用传递 同名变量和方法覆盖问题 ...

  • 深浅拷贝

    JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会进...

  • java一快速入门

    变量 1.基本类型的 2引用类型 1.基本类型的 可以重新赋值,赋值给其他变量, 整数类型:byte(1) ,sh...

  • Java数据类型转换

    Java的类型转换可分为基本类型和引用类型的数据转换。 基本类型的转换 类型转换主要在赋值、方法调用、算术运算三种...

  • 数据类型(2018/03/14)

    js中存在两种数据类型:基本类型和引用类型。 当我们进行赋值操作时,解析器会首先分析数据是值类型还是引用类型。 一...

  • 句柄,引用,对象

    java中有三种数据类型:基本数据类型、引用类型和null类型。其中引用类型包括类类型(含数组)、接口类型。为了区...

  • JS踩坑

    1. 数组和对象是通过引用来赋值 先看下面栗子 简单的说:number,string类型都是基本类型,而基本类型存...

  • C#值类型和引用类型讲解

    1.什么是值类型和引用类型 值类型:直接存储其值,赋值的的时候是传递拷贝。引用类型:存储对其值的引用,赋值的时候是...

  • 值类型和引用类型的特征

    值类型和引用类型的赋值 值类型赋值,直接将值复制一份 上面两句代码,在内存中的体现为: 引用类型赋值,是将地址复制...

  • JS红宝书第四章变量赋值及参数传递问题

    一.基本类型变量按值访问 1.1赋值后变量1变量2各自独立 二.引用类型变量按引用访问 2.1赋值后变量1和变量2...

网友评论

      本文标题:2023-03-03_JSDay05-基本类型和引用类型的赋值区

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