数据类型
- 基本数据类型(在栈中)
- Boolean、String、Number、Null、Undefined、Symbol(ES6)、[BigInt](ES2020)
- 引用数据类型(栈中地址、堆中数据)
- Object
- Function、Array等都属于特殊的对象
- Function、Array、Date、RegExp、基本数据类型的包装、内置对象(Math、Global)
注:NAN属于Number类型,它仅仅标识当前值不是一个数据 ,但是是数值类型(NAN != NAN)
检测数据类型
- typeof
-
console.log(typof 2) //number
- typeof可以精准的判断(string、number、boolean、symbol、undefined原始类型,也可以判断function)
- 判断引用类型就不行了,统一都是object
- 另外,typeof null 是 object
-
- instanceof
-
let arr = ['a',1,2,15,'zhangsan'] let obj = {name:'ZhangSan', age:25} let now = new Date(); function fun() {} let str ='hello world' let num =123456 console.log(arr instanceof Array ); //true console.log(obj instanceof Object ); //true console.log(now instanceof Date ); //true console.log(fun instanceof Function ); //true console.log(num instanceof Number);//无法判断基本数据类型,会返回false console.log(str instanceof String);//无法判断基本数据类型,会返回false
- A instanceof B:A的原型链上有没有B.prototype
- 用来判断引用类型具体是什么对象
- 可以用来检测数据类型,但不准确,而且也不能检测基本数据类型,所以不是最佳选择
-
{} instanceof Object //true
-
-
- constructor
-
console.log((123).constructor == Number) //true
- 某个实例是不是这个构造函数构造出来的,实例和构造函数的关系,null、undefined判断不出来
-
- Object.prototype.toString.call()
-
console.log(Object.prototype.toString.call('')); // [object String]
- 最全面最详细
-
类型转换
显示转换
Number()
有时候会很严格,有一个字符就无法转为数值就为NaN
- Undefined: NaN
- Null: 0
- true: 1、false: 0
- String: 字符串如果不能被解析成数值就直接NaN,''这个是0
- Symbol: 抛出异常
- Object:先toPrimitive,在调用toNumber(通常都是NaN,除了只包含单个数值的数组 )
-
Number([1]) //1 Number([]) //0 Number({}) // NaN
-
parseInt()
- 一个一个解析,遇到不能解的就停下来
-
parseInt('231a') //231
-
Boolean
- String:非空: true、空:false
- Number: 非零数值:true、0或NaN : false
- Object: null是false,其他都是true
- Undefined: false
String()
- Undefined: 'undefined'
- Boolean: 'true', 'false'
- Number: 对应的字符串类型
- String: String
- Null: 'null'
- 对象: toPrimitive
-
String({a: 1}) // '[object, Obect]' String([1,2,3]) //'1,2,3'
-
- Symbol: 抛出异常 TypeError
隐式转换
隐式转换:
- 比较运算符(==、!= 、> 、 < )
- if、while
- 算术运算符(+、-、*、/、%)
- 运算符两边的操作数不是同一类别的时候
转为布尔
- 需要boolean值得地方自动转
- 以下情况都是false, 其余为true
- undefined
- null
- NaN
- ''
- false
- 0
- +0 -0
- 以下情况都是false, 其余为true
转为字符串
- +运算符 字符串拼接
- 如果其中一个是字符串,另一个也会被转换为字符串,否则两个运算数都被转换为数字。
- 先将复合类型转为原始类型(ToPrimitive规则),再将原始类型转为字符串
- 对象
-
'1'+{} == '1[object, object]' '1' + [] == '1'
-
- 如果其中一个是字符串,另一个也会被转换为字符串,否则两个运算数都被转换为数字。
转为数值
- -、/、*
- null 是0 、Undefined是NaN
- 非数字会转换数字
总结数据转换
String、Number、Boolean
String
- 显式转换
- toString()
- String()
- 隐式转换
- a + ''
Number
- 显式转换
- parseInt()
- parseFloat()
- Number()
- 隐式转换
- a+0 a*1等(-*+)
Boolean
- 显式转换Boolean()
console.log(Boolean(''));//false console.log(Boolean(0));//false console.log(Boolean(NaN));//false console.log(Boolean(null));//false console.log(Boolean(undefined));//false console.log(Boolean(1));//true console.log(Boolean('张三'));//true
- 隐式转换
- !!a
- if、while
- 运算符
'=='和‘===’
介绍
等于操作符
- 两个等于号表示,操作数相等就是true
- 会有隐式的类型转换
- 规则
- 两个都为简单类型的,都要转换为数值比较
- 简单类型与引用类型,,引用类型要ToPrimitive规则转换为初始值
- ToPrimitive规则
- 将值转为基本类型
- 对象=> 数字:.valueof() .toString()(这是这儿用到的)
- 对象=> 字符串:.toString().valueOf()
- 将值转为基本类型
- ToPrimitive规则
- 两个都为引用类型就判断他们是否指向同一指针
- 存在NaN 返回false
- Null == Undefined
- null、undefined和任何值== 都为false
全等操作符
- ===
- 两个操作数不转换情况下相等,,才返回true
- null跟undefined与自身严格相等
区别
- 相等运算符会做类型转换,全等运算符不会做
- Null、Undefined在全等运算符下是严格等于本身的,在相等运算符中,这俩相等
使用
- null、undefined的位置上
- 可以用== 代替 ===
- 其余最好用===
- == 会造成直觉错误
-
''!='0' 0 == '' 0 == '0' false!='false' false == '0' ' \t\r\n' == 0
-
- == 会造成直觉错误
参考链接
typeof、instanceof、constructor、toString四种检测数据类型的方法;优缺和区别分析_constructor检测数据类型检测不了object类型-CSDN博客
js检测数据类型得四种方式 - 爱喝酸奶的吃货 - 博客园 (cnblogs.com)