错误: typeof()——只能区分原始类型和function,无法区分内置对象类型
解决:
1. 判断原型对象: var bool=father.isPrototypeOf(child);
判断father是不是child的父对象。
2. 判断构造函数:
var bool=child instanceof 构造函数
判断child是不是用指定的构造函数创建出来的
instance: 实例: 用构造函数创建出的一个子对象
实例化: 用new调用构造函数创建一个对象
问题: 前两个检查不仅检查直接父对象,而且还检查整个原型链。
解决:
3. 检查对象的class属性: 和原型链无关
每个对象中都有一个内部属性class: 记录了对象创建时的类型。一旦创建,不会更改。
问题1: class不允许用.直接访问
解决: obj.toString() -> "[object class]"
其中class可能为: Object Array Date ...
问题2: 多数内置对象重写了toString方法
重写的toString方法已经无法返回class
解决: 临时借用函数:
函数.call(对象) -> 对象.函数()
Object.prototype.toString.call(obj1) -> obj1.toString();
4. ES5 : Array.isArray(obj)