详解JS中的基本数据类型和引用数据类型

  • ECMAScript变量可能包含两种不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象
  • 在将一个值赋值给变量时,解析器必须确定这个值是基本类型值还是引用类型值
  • js的六大数据类型:Number, String, Boolean, Undefined , Null , Object
  • 基本数据类型:Number,String,Boolean, Null
    引用数据类型:Object , Array, Function
    其中的5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值;而引用类型是的值是保存在内存中的对象。与其它语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用,因此引用类型的值是按引用访问的
如何区别两者

1.对于存放两种数据类型的变量 :存放 js基本数据类型的变量存放的是基本类型数据的实际值,而存放引用数据类型的变量是保存对它的引用即指针

2 变量的交换(复制变量时): 对于存放基本数据类型的变量的交换,等于在一个新的作用域创建一个新的空间,新空间与原有的空间不会相互影响
对于存放引用数据类型的变量的交换,并不会创建一个新的空间,而是让对象或方法和之前对象或方法同时指向一个原有空间(即一个地址)

3 声明变量时不同的内存分配: 基本数据类型值(原始值)是存储在栈(stack)中的数据段,即直接存储在变量访问的位置
引用数据类型值是存储在堆(heap)中的对象即存储在变量处的值是一个指针,指向存储对象的内存地址。

4 参数传递的不同 : 首先要明确ECMAScript中所有的函数的参数都是按值来传递的
变量存储的基本类型的值只是把值传递给参数之后参数和这个变量互不影响
变量存储的引用数据类型值存储的是该引用值在堆内存中的内存地址,因此传递的值就是这个内存地址。

举例说明两者区别
    var a = 8;
    var b = a ;//此处a和b有着相同的值,但是两者是相互独立的互不影响
    a = 10;//给a赋了新值,但是不影响b
    console.log(b);//输出8
    var c = [1,2,3];//此处是将一个内存地址存储给了变量c
    var d = c ;//此处c和d指向的是同一个内存地址
    c[0] = 2;//此处将地址的值改变则会影响到d
    console.log(d);//[2,2,3]
    var e = [4,5,6];
    var f = [7,8,9];//在此处f和e指向了不同的内存地址,则两者将不会有任何相互影响
    e[0] = 5;
    console.log(f);//[7,8,9]

总结
基本类型值与引用类型值具有以下特点

  • 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中
  • 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
  • 引用类型的值是对象,保存在堆内存中
  • 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
  • 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此最终两个变量最终都指向同一个对象
  • 确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符

JS面试https://jingyan.baidu.com/article/597a064326352b312b5243d0.html

猜你喜欢

转载自blog.csdn.net/Sunday97/article/details/84869727