边界数据类型条件判断问题
数据类型概念
基本数据类型:undefined null boolean string number symbol bigint
引用数据类型:onject(array date regexp math function)
储存位置:基本数据类型储存在栈内存中,引用数据类型指针储存 在栈内存,值储存在堆内存中,拷贝时一般拷贝的是引用地址
数据类型判断或检测方法
如:如何判断一个对象是否是数组
数据类型判断方法:
(1)typeof:可以检测基本数据类型(null 除外,使用 typeof null--->object(×,为js的bug) ),不能准确检测复杂数据类型(注意:返回的值都为小写)
(2)instanceof:可以检测复杂数据类型,但不判断基本数据类型,用于检测返回值为Object的复杂数据类型
(3)Object.prototype.toString.call(data): 可以检测基本数据类型也可以检测复杂数据类型。会得到 [onject Xxxx]的类型,Xxxx第一个字母大写
eg:
Object.prototype.toString.call(1)-->[object Number]
Object.prototype.toString.call(true)-->[object Boolean]
Object.prototype.toString.call('123')-->[object String]
Object.prototype.toString.call({})-->[object Object]
Object.prototype.toString.call(window)-->[object Window]
封装-检测数据类型的方法:
function getType (obj) {
let type = typeof obj
if( type !== 'object' ) { // 使用typeof判断,如果是基本数据类型则返回
return type
}
// 非基本数据类型,即复杂数据类型的判断
return Object.prototype.toString.call(obj).replace(/^ \[ object(\S+) \] $/, '$1')
}
getType([])-->Array,toString得到
getType(true)-->boolean,typrof得到
getType('123')-->string,typeof得到
getType(/\d*/)-->Regexp,tostring得到
数据类型的转换方法
(1)强制类型转换
Number() parseInt() parseFloat() toString() String() Boolean()
Numberg转换规则:将非数字类型转为数字类型
要转布尔值-->会转为0,1
转数字-->返回数字
转null,空字符串-->返回0
转undefined-->NaN
转Symbol-->抛错
(2)隐式类型转换,表达式里出现逻辑运算符、运算符、关系操作符、相等运算符、if/while条件,遇到两种运算不同的表达式,都是隐式转换