按照 ECMAScript规范可以分为两个不同类型的值:基本数据类型和引用数据类型。
基本数据类型指的是简单的数据段
引用数据类型指的是有多个值构成的对象。
当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值。
基本数据类型和引用数据类型的区别:
1.内存区域不同:
基本数据类型和引用数据类型分别存放在不同的内存区域。基本数据类型存放在栈区,引用数据类型存放在堆区。
就是引用数据类型会在栈区存放数据的引用和地址指针(指向堆区中相应的数据),数据实体则存放在堆区。
2.不同的内存分配机制也带来了不同的访问机制
在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个引用数据类型时,
首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值这就是传说中的按引用访问
基本数据类型的值则是可以直接访问到的。
3.复制变量(变量赋值)时的不同
基本数据类型: 在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已
引用数据类型:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。只是多了一个指针只想相同地方的地址。
4.参数传递的不同
基本数据类型; 只是把变量里的值传递给参数,之后参数和这个变量之间互不影响。
引用数据:对象变量它里面的值是这个对象在堆内存中的内存地址,它传递的值是这个内存地址,函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
数据类型:
基本数据类型: | 引用数据类型 |
Undifined:未定义 | object: 在js中Object是一个基类 |
Null:空 typeof null ==> "object" | []: Array 数组 |
Boolean:true\false | /^$/: RegExp 正则 |
Number:NaN\Infinity\正常数字 | function 函数 |
String:正常字符串\模版字符串 | data 日期 |
Symbol: 唯一值 | |
BigInt: 大数字 |
常见的判断数据类型:
Typeof 检测基本数据类型 typeof 对于基本数据类型判断是没有问题的,但是遇到引用数据类型(如:Array)是不起作用
typeof(null) //object
typeof(undefined) //undefined
instanceof
instanceof 检测的是原型 不考虑 null 和 undefined(这两个比较特殊)以对象字面量创建的基本数据类型
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型
constructor
似乎完全可以应对基本数据类型和引用数据类型 但如果声明了一个构造函数,并且把他的原型指向了 Array 的原型,自定义构造函数的原型改了之后,函数找不到原型,这种情况下,constructor 也显得力不从心。检测undfinded和null无效
原型
Object.prototype.toString.call()
jquery.type() //如果对象是undefined或null,则返回相应的“undefined”或“null”