Open wisetc opened 5 years ago
类型判断,is module,源码参考 redux-saga.
export const undef = (v: any) => v === null || v === undefined;
export const notUndef = (v: any) => v !== null && v !== undefined;
export const func = (f: any) => typeof f === 'function';
export const array = Array.isArray;
export const object = (obj: any) =>
obj && !array(obj) && typeof obj === 'object';
这是一行判断语句引发的bug,
假设存在变量
_vacantReason
,该变量的类型可变,当其为对象时,取出其属性 value 的值。因为_vacantReason
nullable,也可能是其他的类型,只有当其为 object 时,取属性 value 才有意义;当其类型为字符串时,也不会报错,但是返回的结果可能是undefined
,当其为 null 时,会报错。我们看一下下面几条语句的执行结果,
t1.
typeof null
结果为
'object'
,如下图,t2.
typeof undefined
结果为![image](https://user-images.githubusercontent.com/9448115/55374749-30678480-553c-11e9-86e6-104061f4092c.png)
'undefined'
,如下图,t3.
null instanceof Object
结果为![image](https://user-images.githubusercontent.com/9448115/55374848-889e8680-553c-11e9-9aee-0e4b344a51f2.png)
false
,如下图,t4.
undefined instanceof Object
结果为![image](https://user-images.githubusercontent.com/9448115/55374897-bc79ac00-553c-11e9-987f-9d3a18b273e2.png)
false
,如下图,t5.
{} instanceof Object
结果为![image](https://user-images.githubusercontent.com/9448115/55375298-33637480-553e-11e9-8314-d71804b05eb5.png)
true
,如下图,再看字符串取属性,
结果,字符串的属性,为其原型对象的属性,如下图,![image](https://user-images.githubusercontent.com/9448115/55374951-ea5ef080-553c-11e9-8d33-bf13ecc1f319.png)
最后再来看看
Function toString
运行的结果如下图,
结论
js 中 undefined 比较特殊,typeof null 为'object',
null
和undefined
都不是 Object 的实例,所以不能访问任何属性。访问一个可变类型对象
o
的属性的时候,需要先对其类型进行判断,可以使用o instanceof Object
,也可以使用Object.prototype.toString.call(o) === '[object Object]'
,但是前者 o 可为数组或者其他对象,他们也是 Object 的实例。故原先的判断条件应该修正为,避免了 _vacantReason 初值为
null
时,抛出异常。