typeof
操作符typeof
是一种原始的、内置的方式,用于判断数据的类型。它适用于判断基本数据类型,如字符串、数字、布尔值、函数、undefined
和 symbol
。然而,对于 null
和对象(包括数组、日期等),typeof
的结果有些混淆。
示例:
console.log(typeof "hello"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (这是一个历史遗留的错误)
console.log(typeof {}); // "object"
console.log(typeof []); // "object" (数组也是对象)
console.log(typeof function() {}); // "function"
局限性:不能区分对象的具体类型,如数组和对象都会返回 "object",且对 null
的判断结果也是 "object"。
instanceof
操作符instanceof
用于检测一个对象是否是某个构造函数的实例。它可以用来判断复杂对象类型,如数组、日期等。
示例:
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(new Date() instanceof Date); // true
console.log(function() {} instanceof Function); // true
console.log([] instanceof Object); // true (数组也是对象)
局限性:无法检测原始数据类型,因为它们不是对象。此外,跨窗口或 iframe 时,由于不同的全局环境,可能会出现问题。
Object.prototype.toString.call()
这种方法返回精确的数据类型,是一种通用的方法。它返回 "[object Type]" 格式的字符串,其中 Type 是数据类型。
示例:
console.log(Object.prototype.toString.call("hello")); // "[object String]"
console.log(Object.prototype.toString.call(42)); // "[object Number]"
console.log(Object.prototype.toString.call(true)); // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call({})); // "[object Object]"
console.log(Object.prototype.toString.call([])); // "[object Array]"
console.log(Object.prototype.toString.call(function() {})); // "[object Function]"
console.log(Object.prototype.toString.call(new Date())); // "[object Date]"
优点:可以精确区分各种对象和原始类型,甚至包括 null
和 undefined
。
constructor
属性每个对象的 constructor
属性指向创建该对象的构造函数。可以通过检查对象的 constructor
属性来判断其类型。
示例:
console.log(({}).constructor === Object); // true
console.log(([]).constructor === Array); // true
console.log((new Date()).constructor === Date); // true
console.log((function() {}).constructor === Function); // true
局限性:原始类型没有 constructor
属性。此外,手动改变对象的 prototype
属性可能会改变其 constructor
,导致误判。
Array.isArray()
专门用于判断是否为数组的内置方法。
示例:
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
优点:这是判断数组类型的最可靠方法。
typeof
。Object.prototype.toString.call()
是最可靠的方法。instanceof
也适用于判断对象类型,但有时会受到跨窗口环境的影响。Array.isArray()
判断数组。这些方法各有优缺点,选择时要考虑具体的应用场景。