JS数据类型
基本类型5种
Number String Boolean Undefined Null
特殊引用类型10种
Object Array Date RegExp Function
基本包装类型Boolean Number String
Global Math
检测数据类型的方法
1.typeof
操作数可以是基本类型,也可以是引用类型
返回值为字符串,种类有:undefined,boolean,string,number,object,function
- 基本类型返回基本类型名称的字符串
- 基本类型返回基本类型名称的字符串
- 引用类型(除了function)都返回object。其中问题在于null也会返回object,且对于正则表达式的返回有的返回function,有的返回object
所以typeof只能用于判断是否是引用类型,以及是哪种基本类型。
2.instanceof
检测对象类型,如果左操作数是右操作数的实例,返回true
可用来检测原型关系。
3.Object.prototype.toString.apply(obj)
基本类型和基本包装类型返回一样,其他继承于Object的自定义引用类型返回Object。
返回值格式为[object **],可通过.split(8:-1)
得到其类型字符串
返回值种类有:Null Undefined Number Boolean String Function Object。
可以用来补充typeof操作符不足,判断是不是null。
类型转换规则
1.其他类型转换成Boolean类型
Boolean类型值只有两种,true和false,区分大小写
其他类型转换成为Boolean类型时,调用Boolean()方法
- 空字符串、0、NaN、null、undefined均转换成false
- 非空字符串、非零数值、Infinity、任何对象转换成true
2.其他类型转换成String类型
其他类型转换成String类型时,调用String()方法
- 如果有toString()方法,则调用toString()方法(null和undefined没有这个方法)
- 对于数值类型转换成数值字符串
- true 转换成 ‘true’
- false 转换成 ‘false’
- null 转换成 ‘null’
- undefined 转换成 ‘undefined’
3.任何类型转换成Number类型
数值类型分整数和浮点数(最高精度17位小数,有误差)
几个特殊值:
- Number.MIN_VALUE:所能表示最小数值
- Number.MAX_VALUE:所能表示最大数值
- -Infinity:负无穷大,不在所能表示的数值范围内的负数
- Infinity:正无穷大,不在所能表示的数值范围内的正数
- NaN:不是数值
针对特殊数值的两个函数
- isFinite()函数,是否位于最大数值与最小数值之间
- isNaN()函数,是否不是数值(NaN)
任何涉及NaN的操作都会返回NaN,NaN和任何值都不相等,包括NaN自身。
由于特殊数值的存在对于+、 -、 *、 /、 %等操作需要额外的进行说明
对于“+”操作符
- Infinity+Infinity=Infinity
- (-Infinity)+(-Infinity)=-Infinity
- Infinity+(-Infinity)=NaN
- (+0)+(+0)=(+0)
- (+0)+(-0)=(-0)
- (-0) +(-0)=(-0)
对于“-”操作符
- Infinity-Infinity=NaN
- (-Infinity)-(-Infinity)=NaN
- -Infinity-Infinity=-Infinity
- Infinity-(-Infinity)=Infinity
- (+0) -(+0)=(+0)
- (+0) -(-0)=(+0)
- (-0) -(-0)=(+0)
对于“*”操作符
- Infinity*0=NaN
- Infinity*非0=Infinity或-Infinity
- Infinity*Infinity=Infinity
- 对于“/”操作符
- 0/0=NaN
- 有限大/0=Infinity或-Infinity
- Infinity/ 有限大 =Infinity或-Infinity
- Infinity/Infinity=NaN
- 对于“%”操作符
- 0%任何数=0
- 有限大 %Infinity =被除数
- Infinity% 有限大=NaN
- Infinity%Infinity=NaN
- 有限大 %0=NaN
有一个操作数是NaN,结果为NaN
其他类型转换成Number类型时,调用Number()函数
parseInt()和parseFloat()函数用于将字符串转换成相应数值
- true 转换成 1
- flase 转换成 0
- null 转换成 0
- undefined 转换成 NaN
- 空字符串转换成 0
- 以包含各种形式的数值开头的字符串转换成相应的数值
- 其他字符串转换成NaN
- 对于对象将依次调用valueOf(),toString()尝试返回非NaN的值,如果不能则返回NaN
parseInt()对空字符串返回NaN
parseFloat()只解析十进制数,可以返回整数
隐式类型转换
主要包含以下几种情况:
1.操作符
++ 、 – 、一元+ 、 一元- 、 ~ 、& 、| 、^ 、<< 、>> 、 >>> 、* 、 / 、%
针对Number类型的,因此对其他类型应用这些操作符时,自动执行Number()函数进行类型转换
其中对于位操作符,NaN和Infinity都会当成0处理
+
- 两个操作数都是数值,就是数值操作
- 有一个操作数是字符串,就执行字符串拼接
- 其他情况都先执行String()方法进行类型转换成String类型,然后进行字符串拼接
>、<、>=、<=
- 除了两个操作数都是字符串的情况,其他都转换成Number类型比较大小
- 任何操作数与NaN进行比较,结果都是false
- 对于两个操作数都是字符串,比较的是字符串的字符编码
==、!=
强制类型转换,一般都是转换为数值
- 这里判断的相等只能说明值相等(对于基本类型)或引用相等(对于引用类型),并不能说明类型也一致。
- NaN和任何值都不相等
- 对象相等是指向同一对象才相等
- undefined == null 返回true,因为ECMA262规定的
判断到底是不是null或到底是不是undefined需要用===
===、!==
不经类型转换就相等
一般用来对类型相同,值也相同的判断
null!==undefined;//返回true
2.if语句、条件操作符 、! 、while语句
这种针对Boolean类型的,因此对其他类型应用这些操作符时,自动执行Boolean()函数
由于空字符串、0、NaN、null、undefined均会转换成false,在检查一个变量是否未定义,不要用真值检测,要用typeof和===。
3.特殊情况
&&
短路操作,不一定返回布尔值
- 第一个操作数是对象,返回第二个操作数
- 第二个操作数是对象,则第一个操作数求值为true时,返回该对象
- 两个操作数都是对象,返回第二个操作数
- 有一个操作数是null,返回null
- 有一个操作数是NaN,返回NaN
- 有一个操作数是underfined,返回undefined
不能使用未定义的值,否则报错
||
短路操作,不一定返回布尔值
- 第一个操作数是对象,返回第一个操作数
- 第一个操作数求值为false时,返回第二个操作数
- 两个操作数都是对象,返回第一个操作数
- 有两个操作数都是null,返回null
- 有两个操作数是NaN,返回NaN
- 有两个操作数是underfined,返回undefined
不能使用未定义的值不能使用未定义的值,否则报错
应用:赋值操作经常采用
var aObeject = firstObject || secondObject;
4. isNaN()
将其他不是NaN的尝试转换成NaN,因此isNaN不能用来检测是不是NaN,只能用来检查是不是可用数值。
isNaN("str"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ a: "b" }); // true
可以用下面这个函数来检查是不是NaN。
function isReallyNaN(x) {
return x !== x;
}