使用 typeof bar === "object" 来判断 bar 是否为一个对象在JavaScript中有一些弊端和限制:
Null 的问题:在JavaScript中,null 是一个表示“无”或“空”的特殊值,但 typeof null 的结果实际上是 "object"。这是一个历史遗留的错误,因此如果你只是用 typeof 来检查对象,你可能会错误地将 null 也当作一个对象。
正确的做法是首先检查 bar 是否为 null,然后再使用 typeof:
javascript
if (bar !== null && typeof bar === "object") {
// bar 是一个对象
}
数组的问题:在JavaScript中,数组实际上是特殊的对象。因此,typeof 对于数组也会返回 "object"。这通常不是问题,因为数组确实是对象,但有时你可能想要区分普通的对象和数组。在这种情况下,你可以使用 Array.isArray() 方法:
javascript
if (Array.isArray(bar)) {
// bar 是一个数组
} else if (bar !== null && typeof bar === "object") {
// bar 是一个非数组对象
}
其他非普通对象:除了数组,JavaScript还有其他一些内置的类型,如函数、日期、正则表达式等,它们也都是对象,但可能不是你想要检查的“普通”对象。例如,typeof function() {} 返回 "function",而不是 "object",但函数实际上是对象。类似地,日期和正则表达式也有它们自己的构造函数和类型。
包装对象:JavaScript有原始类型和对应的包装对象(如 Number、String、Boolean)。虽然 typeof 对于原始值(如字符串、数字和布尔值)会返回 "string"、"number" 或 "boolean",但如果你创建了一个包装对象(如 new Number(42)),则 typeof 会返回 "object"。通常,你不应该使用包装对象,而应该使用原始值,因为它们在JavaScript中更常用,也更高效。
综上所述,虽然 typeof bar === "object" 可以作为一个基本的检查来确定 bar 是否可能是一个对象,但在实际应用中,你可能需要更复杂的逻辑来准确地确定 bar 的类型。
可以通过Object.prototype.toString.call(bar) === "[object Object]" 来避免这种弊端:
let obj = {};
let arr = [];
console.log(Object.prototype.toString.call(obj)); //[object Object]
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(Object.prototype.toString.call(null)); //[object Null]
6
另外,为了珍爱生命,请远离==: