大体分类
- 基本数据类型
- number
- boolean
- undefined
- string
- null
- symbol(es6)
- bigint
- 引用数据类型
- object
- 普通对象
- Math
- Date
- Array
- ....
- function
- object
数据类型检测
- typeof 检测数据类型
- instanceof 检测引用数据类型的原型链中是否有某一构造函数
- constructor 每个原型中都会有constructor属性指向它的构造函数
- Object.prototype.toStrong.call()
typeof
typeof只能检测数据类型,也就是number,string,boolean,undefined,null,symbol,bigint,object,function
alert(typeof 1) //"number"
alert(typeof "2") //"string"
alert(typeof undefined) //"undefined"
alert(typeof true) //"boolean"
alert(typeof Symbol("i")) //"symbol"
alert(typeof BigInt('34')) //"bigint"
alert(typeof {}) //"object"
alert(typeof Object.assign) //"function"
//比较特殊的
alert(typeof null) //"object")
typeof总结
typeof XXX 的结果是字符串 typeof只能检测数据类型不能检测对象具体所属的类 并且null的typeof职位"object"
其他数据类型转换为数字类型
强转换
一般不是用parseInt和parseFloat方法进行转化的都可认为是强类型转换 底层原理,使用Numer()
不同数据类型通过Number转化后的结果
- 字符串类型 数字字符串 :Number("123")-> 123 Number("")->0 字符串中不都是有效数字: Number("12px")-> NaN
- boolean类型 true: Number(true)-> 1 false: Number(false)-> 0
- undefined Number(undefined)-> NaN
- null Number(null)-> 0
isNaN
NaN(not a number)是number类型的,但是NaN==NaN永远不成立,因为NaN不跟任何值相等,想判断是否是NaN就用isNaN()这个方法,这个方法底层调用Number()把传入的数据转化成数字类型判断结果为true/false
+号运算
当进行运算时如果+碰到字符串/对象就要进行字符串拼接(字符串直接拼,对象调用toString()方法),如果是其他数据类型就调用Number()转化成数字运算
这里的对象实际上是先调用同String()转化成字符串再Number('那个自符串')转化成数字类型的,但是在转成字符串之后被+拦截 拼接字符串去了
==等号两边值得隐式转换
一般都要把==号两边转换为统一数据类型再进行比较
- 对象==字符串 对象调用toString()转化成字符串后比较 -null==undefined 只有她两相等(===时不相等),null与undefined与任何值都不等, 例如: 0==null 结果为false,不会把null转换成数字
- NaN NaN与任何值比较都是false
- 其他类型==比较 把两边的数据都Number()转化成数字类型再比较
[]==false //0==0 =>true
![]==false //false==false =>true
//这里的比较涉及到运算的优先级取反优先于==,所以要先算![]
弱转换
parseInt() 和 parseFloat(),利用这两个方法对数据进行弱转换 传入数据首先要被转化成字符串,然后从左往右解析字符串,遇到不是有效数字就停止解析
其他值转换成boolean值
除了 0/NaN/null/undefined/"" 转化为boolean值为false,其他为true !!代表把其他值转化为boolean值 !![] =>true !!{} =>trued