如果觉得还有点用,请您给我一个赞!您的赞是我坚持下去的动力
常用的类型判断方法有
- target.constructor === Object
判断target变量的constructor是否为某个对象 - typeof target
返回target的值只能是number、string、undefined、boolean、function、object
其中一个 - target instanceof Object
判断target.proto 是否在Object.prototype原型链中存在
target和Object必须都是object,并且Object必须有prototype(null,undefined是没有prototype的) - Object.prototype.toString.call(target)
然后下面的表显示了4种类型检测方法的呈现结果
总体来说要想很精准的判断target是否为某个类型,使用 target.constructor最为准确, typeof和Object.prototype.toString.call用来判断js常规类型比较好,其中后者更准确
==和===
-
==
会在比较的时候将类型强制转换后对比 -
===
比较的时候不会进行类型转换
类型转换
- 几种需要特别注意的转换结果:
- Number('f') : NaN
- Number('')/Number(' ')/Number(null): 0
- Boolean(-1)/Boolean(''): false
- Boolean({})/Boolean(' '):true
- String({}): "[object Object]"
什么时候触发类型转换
当2个变量遇见 >、<、==、加减乘除、||、&& 时-
转换为什么?
- 默认触发数值转换,可以理解为 Number(left) > Number(right)
- +value: 触发数值转换 Number(value)
- 当 left + right 中其中一个是字符串的话,触发字符串转换 String(left) + String(right)
- ==:触发数值转换 Number(left) == Number(right)
- null == right : null只同null和undefined相等,其他情况均false
- !!:触发布尔转换
- 数组: 数组先触发toString 然后在看对比对象进行再次转换
- [1,2,3]+[4,5,6] : [1,2,3].toString()+[4,5,6].toString()
- []+null+1: [].toString()+null+1 -> ''+null+1 -> "null"+1 -> "null1"
- ||或&&:触发布尔
-
几个特别的案例,可以想想为什么?
- []!="" // false
- NaN!=NaN //false
- NaN===NaN //false
- if({})、if([]) //true
- if(0)、if('') //false
如果觉得还有点用,请您给我一个赞!您的赞是我坚持下去的动力