在 JavaScript 中,我们经常需要判断一个变量的类型。这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑。
JavaScript 提供了几种方法来检测数据类型,每种方法都有自己的优缺点。
Object.prototype.toString.call()
这是最万能的方法。它可以准确识别所有的 JavaScript 内置类型,包括基本类型和复杂类型。不管你给它传什么数据,它都能给出一个统一格式的字符串,告诉你这个数据到底是什么类型。
它的原理是调用对象内部的 [[Class]]
属性。这个属性是只读的,不能被改写,所以非常可靠。
优点:
缺点:
function detectType(data) {
return Object.prototype.toString.call(data).slice(8, -1).toLowerCase();
}
console.log(detectType(123)); // 'number'
console.log(detectType('abc')); // 'string'
console.log(detectType(true)); // 'boolean'
console.log(detectType(null)); // 'null'
console.log(detectType(undefined)); // 'undefined'
console.log(detectType([])); // 'array'
console.log(detectType({})); // 'object'
console.log(detectType(function () {})); // 'function'
console.log(detectType(new Date())); // 'date'
console.log(detectType(new RegExp())); // 'regexp'
console.log(detectType(new Error())); // 'error'
typeof
这个运算符最常用,写起来简单。它可以识别基本类型和函数,但对复杂类型的识别能力有限。
优点:
缺点:
console.log(typeof 123); // 'number'
console.log(typeof 'abc'); // 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined); // 'undefined'
console.log(typeof null); // 'object' (这是一个历史遗留的 bug)
console.log(typeof []); // 'object'
console.log(typeof {}); // 'object'
console.log(typeof function () {}); // 'function'
instanceof
instanceof
运算符用于测试构造函数的 prototype
属性是否出现在对象的原型链中的任何位置。
优点:
缺点:
只能检查对象类型,不能检查基本类型
要识别多种类型,需要多次调用
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function () {} instanceof Function); // true
console.log(new Date() instanceof Date); // true
console.log(new RegExp() instanceof RegExp); // true
console.log(new Error() instanceof Error); // true
console.log(123 instanceof Number); // false
console.log('abc' instanceof String); // false
console.log(true instanceof Boolean); // false
constructor
constructor
是对象的一个属性,指向创建该对象的构造函数。可以用它来判断对象的类型。
优点:
缺点:
console.log((123).constructor === Number); // true
console.log('abc'.constructor === String); // true
console.log(true.constructor === Boolean); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true
console.log(function () {}.constructor === Function); // true
console.log(new Date().constructor === Date); // true
console.log(new RegExp().constructor === RegExp); // true
console.log(new Error().constructor === Error); // true
总结
如果需要全面准确的类型识别,Object.prototype.toString.call()
是最佳选择。
如果只需要简单区分基本类型,typeof
就足够了。
如果要检查对象是否属于特定类型,可以用 instanceof
。
转自https://www.cnblogs.com/leadingcode/p/18362986
该文章在 2024/8/19 8:53:41 编辑过