JS基础 - 类型
类型分类
- 原始类型
包括数字,字符,布尔,null,undefined。
- 数字:语言本身没有整数和浮点类型,变量为64位浮点数,溢出的取值为+/-Infinity,非法数字取值为NaN。
- 字符:由16位的字符组成。不能改变字符串中的字符值。
-
undefined,Infinity和NaN都是全局属性。
-
对象类型
包括对象(实例),数组,函数(可执行对象),类(ES2015+)。
类型判断
- typeof
typeof是一个运算符,可以返回操作数类型的字符串。
- 操作数为数字,字符,布尔的原始类型时,分别返回"number", "string", "boolean"。
- typeof null返回"object"。
- typeof undefined返回"undefined"。
- 操作数为对象/数组实例时,返回"object"。
-
操作数位可执行对象时,返回"function"。
-
instanceof
instanceof是一个运算符,可以判断左操作数是否是右操作数的实例,是则返回true,否则范围false。 - Object.prototype.toString.call
通过Object.prototype.toString.call(value)方式,可以检查一个变量所属的类型,但无法检查自定义对象类型。
- 操作数为数字、字符、布尔的原始类型时,返回[object ],type是将原生类型转换为对象后的类型,例如:String, Number, Boolean。
- 操作数是null时,返回[object Null]。
- 操作数是undefined时,返回[object Undefined]。
- 操作数是对象时,返回[object ],type是对象所属类型,包括本地对象、内置对象和宿主对象,但对于自定义对象,type都是Object。
- 操作数是可执行对象或class时,返回[object Function]。
类型转换
类型转换规则
- 原始类型转原始类型
数字 | 字符 | 布尔 | |
数字 | – | 原值 | 0/NaN -> false 其他 -> true |
字符 | NaN | – | true |
布尔 | true -> 1 false -> 0 |
"true"或"false" | – |
null | 0 | "null" | false |
undefined | NaN | "undefined" | false |
-
原始类型转对象类型
-
字符类型用String对象包装
- 数字类型用Number对象包装
- 布尔类型用Boolean对象包装
-
null和undefined不能做对象包装
-
对象类型转原始类型
-
对象类型转字符类型规则
-
对象类型转数字类型规则
运算类型转换
不同类型的操作数在做运算,或者操作数是对象类型时(===除外),会先对数据类型做隐式转换,转换规则如下:
- +表达式运算
- 对象类型转换为原始类型再运算,非日期类型按对象转数字的规则,日期类型直接转换为字符类型。
- 其中一个操作数是字符,则都转换为字符类型运算。
-
没有操作数是字符类型,则都转换为数字类型运算。
-
算术表达式运算
包括-, ++,–,位运算等表达式(不含+运算),所有类型都会转换为数字再运算。 -
关系表达式运算
- 包括==,!=以及比较运算符,所有类型都会转换为数字再运算。
- 如果操作数为null或undefined,则在==运算时返回true。
-
如果两个操作数都为对象类型,且为同一个对象,则在==运算时返回true。
- 逻辑表达式运算
包括&&,||,!等运算符,false、null、undefined、0、NaN的操作数运算结果为假,其它操作数运算结果都为真。