JS的基本类型、引用类型数据在内存存储和变量赋值的区别

JS有两种变量类型:

1.基本数据类型:

  • null
  • undefined
  • string
  • number
  • boolean

3.引用(对象)类型:

  • function
  • array
  • object

这两种变量类型在内存中的存储区别非常大。

两种变量类型的存储:

  • 变量是基本类型:变量保存的值就是数据。
  • 变量是引用类型:变量保存的值是地址值。

注意:全局、局部变量都是存储在栈中,而对象是存储在堆中(对象包括数组、函数)。

在这里插入图片描述
正由图所示那样,基本类型变量,其变量与值都是存在栈中,而引用类型是在栈中存了变量名和一个指向堆中存放数据的地址。

注意:引用类型的变量给另一个变量赋值或传参时,实际是给另一个变量赋值地址值,即让另一个变量也指向它所指的中的数据。

示例:

let obj={
    
    
	name:'鸭绒'
}
let obj1=obj;

上面的赋值操作实际如图所示:

在这里插入图片描述
正如红色部分指针,obj的值是一个地址值,指向了堆中的数据。

下面看看引用变量的赋值问题:

思考1:假如有两个变量指向同一个对象,通过一个变量修改对象内部的数据,那另一个对象内部数据会改变吗?

      var obj = {
    
    
        name: '鸭绒',
        age: 18,
      }
      var obj1 = obj
      obj1.name = '唐老鸭'
      obj1.age = 23
      console.log(obj, obj1)

在这里插入图片描述
答案是会变的,因为它们指向堆中的同一数据,当堆中的数据被一个变量修改后,另一个变量再读取数据是修改后的数据。

思考2:假如有两个引用变量指向同一个对象,后来让其中一个引用变量指向了另一个对象,那他们修改数据,还会相互影响吗?

示例:

      var obj = {
    
    
        name: '鸭绒',
        age: 18,
      }
      var obj1 = obj;//此时两个变量指向同一个对象

	  //让obj指向另一个对象
      obj={
    
    
        name:'唐老鸭',
        sex:'男',
      }
      obj1.name='姜葱鸡'

      console.log(obj,obj1)

在这里插入图片描述

obj后来指向了另一个对象,则obj、obj1指向的不是堆中同一个数据,故修改数据不再相互影响。

图表说明:

在这里插入图片描述
obj修改了指向。

猜你喜欢

转载自blog.csdn.net/weixin_43334673/article/details/109607056