数据类型
JS数据类型分为5种基本数据类型,1种引用(复杂)数据类型。
基本数据类型
- Number
- 其中NaN是Number类型的一种值,NaN(数字型值):“not a number”,不是一个数,NaN是数字类型的值。0除以0为NaN。在数学运算中,如果不能得到数字,结果往往都是NaN。NaN不等于NaN
- String:加号拼接字符串
- Boolean
- Null:typeof null为object
- Undefined:又是值又是一种类型,这种类型只有undefined一个值
注意:typeof null的结果为object(js最初的版本中使用的是32位系统,为了性能考虑地位存储变量的类型信息,000开头表示为对象类型,然而null为全0,故而null被判断为对象类型)
基本数据类型之间的转换
其他值---->数字
- Number()函数
字符串---->数字:纯数字字符串能变为数字,不是纯数字的字符串将转为NaN,空字符串变为0
布尔值---->数字:true为1,false为0
undefined---->数字:NaN
null---->数字:0 - parseInt()函数:将字符串转为整数
parseInt将自动截掉第一个非数字字符之后的所有字符以及文字,如果字符串不是以数字开头,直接转为NaN,parseInt不四舍五入 - parseFloat()函数:将字符串转为浮点数
parseInt/parseFloat(true/false)为NaN,因为这两个函数本质上是将字符串变为数字,布尔值会被隐式转换为字符串,字符串true、false在parseInt/parseFloat中得到的结果为NaN
其他值---->字符串
- String():科学计数法和非10进制数字会被转换为10进制的字符串
- toString()方法(更常用)
其他值---->布尔值
- Boolean()函数
数字---->布尔值:0和NaN转为false,其他为true
字符串---->布尔值:空字符串为false,其他为true
undefined---->布尔值:false
null---->布尔值:false
注意:4/0为Infinity
引用数据类型
- object
- object
- json
- array
- function
基本数据类型与引用类型的区别
基本数据类型与引用类型有5种区别,分别为:
- 值不同,基本数据类型是简单的数据段;引用数据类型是那些可能由多个值构成的对象
- 访问机制不同,基本数据类型是按值访问的;引用数据类型是按引用访问的
- 对属性的支持不同,基本数据类型不能动态添加属性;引用数据类型可以动态添加
- 内存分配不同,基本数据类型存储在栈内存;引用数据类型存储在堆内存,相当于一个指针指向内存地址
- 参数传递不同,ECMAScript中所有函数的参数都是按值来传递的。基本数据类型只是把变量里的值传递给参数,之后参数和这个变量互不影响;引用数据类型传递是内存地址,所以对函数里面参数的修改会引起外部的变化
判断数据类型的方法
- typeof:返回值为表示类型的字符串
typeof null //'object'
typeof [] //'object'
typeof {} //'object'
typeof NaN //‘number’
typeof 对对象类型的值的类型不能作出准确判断,能准确判断出基本数据类型的值
- instanceof:A instanceof B判断A是否为B的实例,如果是,则返回 true,不是则返回 false。instanceof检测的是原型,内部机制其实就是判断对象 A 的原型链中是否有B的原型。
'123' instanceof String //false
1 instanceof Number //false
true instanceof Boolean //false
new String('123') instanceof String //true
NaN instanceof Number //false
由于undefined和null没有构造函数,所以使用 instanceof 会报错。instanceof无法判断基本数据类型。
- constructor
(new Error()).constructor == Error //true
[].constructor = Array //true
undefined.constructor == undefined //报错
null.constructor == null //报错
NaN.constructor == Number //true
constructor判断undefined和null会报错
- Object.prototype.toString.call()
Object.prototype.toString.call()是判断数据类型最准确的方法