介绍js全部数据类型,基本数据类型和引用数据类型的区别
一、JavaScript全部数据类型
内置类型 空值 null 未定义 undefined 布尔值 boolean 数字 number 字符串 string 对象 object 符号 symbol 长整型 bigInt
1.基本数据类型
undefined null number boolean string symbol
基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值.
- 1.1基本数据类型的值是不可变的
- 1.2基本数据类型不可以添加属性和方法
- 1.3基本数据类型的赋值是简单赋值
- 1.4基本数据类型的比较是值的比较
- 1.5基本数据类型是存放在栈区的
2.引用类型
JS中除了上面的基本类型之外就是引用类型了,也可以说是对象,比如:object array function data等
- 2.1引用类型的值是可以改变
- 2.2引用类型可以添加属性和方法
- 2.3引用类型的赋值是对象引用
- 2.4引用类型的比较是引用的比较
- 2.5引用类型是同时存在栈区和堆区的
二、基本数据类型和引用数据类型的区别
1.声明变量时不同的内存分配
原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。是因为这些原始类型占据的空间是固定的,所以可以将它们存储在较小的内存区域---栈中,这样存储便于迅速查询变量的值
引用值:存储在堆(heap)中的对象。也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。是因为引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查询的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
2.不同的内存分配机制也带来了不同的访问机制
在js中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问。而原始类型的值是可以直接访问到的。
3.复制变量时的不同
原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,它们只是拥有相同的value而已
引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中同一个对象,他们中任何一个做出的改变都会反映在另一个身上。(需要理解的一点是:复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)
4.参数传递的不同(把实参复制给形参的过程)
首先我们应该明确的一点是:ESCMAScript中所有函数的参数都是按值来传递的。 但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?这就是因为内存分配时的差别。
原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响
引用值:对象变量里面的值是这个对象在堆内存中的内存地址,这一点很重要!因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因,因为它们都指向同一个对象。
数据类型有8种: 空值 null 未定义 undefined 布尔值 boolean 数字 number 字符串 string 对象 object 符号 symbol 长整型 bigInt
基本数据类型有 undefined null number boolean string symbol
引用类型也可以说是对象 object array function data等
基本数据类型 是存储在栈(stack)内存中的。 引用数据类型
变量放在栈空间的值是,数据存储在堆(heap)内存中的地址。