js中基本数据类型和引用数据类型的区别

  1. JavaScript和ECMAscript的区别
    JavaScript一种通用的浏览器脚本语言,遵循 ECMAScript 语法规范,
    是 ECMAScript 语言的一个分支版本。

  2. 基本数据类型和引用数据类型
    ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。
    基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。
    当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值。

  3. 基本数据类型:

  • 基本数据类型:Number、String 、Boolean、Null和Undefined
    (基本数据类型是按值访问的)
	var a = 10;
	var b = a;
	b = 20;
	console.log(a); // 10值

b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。

  1. 引用类型数据:
    也就是对象类型,比如:Object 、Array 、Function 等。

javascript的引用数据类型是保存在堆内存中的对象,
在栈内存中保存的是一个对象在堆内存中的地址。访问对象和复制对象操作的都是栈内存中的地址罢了,而修改的话,操作的是栈内存中的数据,所以一旦修改,所有深度复制的对象的值都会改变

	var obj1 = new Object();
	var obj2 = obj1;
	obj2.name = "我有名字了";
	console.log(obj1.name); // 我有名字了

说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给onj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给了obj2,

但是实际上他们共同指向了同一个堆内存对象。实际上改变的是堆内存对象。

  1. 区别
  • a,声明变量时不同的内存分配
    原始数据:存储在栈(stack)中的简单数据段

    这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。

    引用数据:存储在堆(heap)中的对象,同时在栈中也存储了一个堆中该对象的地址。

    引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址

  • b,不同的内存分配机制也带来了不同的访问机制
    原始数据: 可以直接访问栈中数据的值

    引用数据: 在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个**对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问。

  • c, 复制变量(变量赋值)时的不同
    原始数据: 在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已

    引用数据: 对象复制时,原变量会把自身保存的内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上

  • d,参数传递的不同(把实参复制给形参的过程)
    原始数据; 只是把变量里的值传递给参数,之后参数和这个变量互不影响。

    引用数据:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。

参考链接 https://www.cnblogs.com/cxying93/p/6106469.html

你可能感兴趣的:(javascript)