关于使用typeof bar ===“object” 潜在缺陷讨论
尽管typeof bar === “object” 是检查bar是否是对象的可靠方法,但JavaScript中令 人惊讶的问题null也被认为是一个对象!
因此,对于大多数开发人员来说,下面的代码会将true ( 而不是false)打印到控制台:
var bar = null;
consolelog(typeof bar === "object"); // logs true!
只要知道这一点,就可以通过检查bar是否为空来轻松避免该问题:
console.logl(bar !== null) && (typeof bar === "bject')); // logs false
为了让我们的答案更加的完整,还有两件事值得注意:首先, 如果bar是一个函数,上 面的解决方案将返回false。在大多数情况下,这是所期望的行为,但是在您希望函数返回true的情况下,您可以将上述解决方案修改为:
console.log(bar !== null && ((tpeof bar === "object") II(typeof bar === "function');
其次,如果bar是数组,则上述解决方案将返回true (例如,如果var bar=D;)。在大多数情况下,这是所希望的行为,因为数组确实是对象,但是在您想要对数组也是false的情况下,可以将上述解决方案修改为:
console.log((bar !== null) && (typeof bar === "object") && (to-String.call(bar) !== "[object Ary'");
但是,还有一个替代方法对空值,数组和函数返回false, 但对于对象则为true:
console.log((bar !== null) && (bar constructor === Object));或者,如果您使用jQuery:
console.log((bar !== nul) && (typeof bar === "object") && (!$.isArry(ab)));
ES5使得数组的情况非常简单,包括它自己的空检查:
console.log(Array.isArray(bar));