在JavaScript中,有多种方式可以判断变量的数据类型。以下是其中的一些常见方法:
- typeof 运算符
typeof
运算符返回一个表示未定义、函数、对象(在JavaScript中,数组和null也是对象)、布尔值、数字、字符串或符号的字符串。
let num = 123;
console.log(typeof num); // "number"
let str = "hello";
console.log(typeof str); // "string"
let obj = {};
console.log(typeof obj); // "object"
let arr = [];
console.log(typeof arr); // "object",注意这里返回的是"object",而不是"array"
let func = function() {};
console.log(typeof func); // "function"
let undef;
console.log(typeof undef); // "undefined"
let sym = Symbol('test');
console.log(typeof sym); // "symbol"
注意:typeof null
会返回 "object"
,这是一个常见的JavaScript错误。
- instanceof 运算符
instanceof
运算符用于测试构造函数的 prototype
属性是否出现在对象的原型链中的任何位置。
let arr = [];
console.log(arr instanceof Array); // true
let date = new Date();
console.log(date instanceof Date); // true
let obj = {};
console.log(obj instanceof Object); // true
- constructor 属性
每个JavaScript对象都有一个 constructor
属性,它引用了创建该对象实例的构造函数。
let date = new Date();
console.log(date.constructor === Date); // true
let arr = [];
console.log(arr.constructor === Array); // true
let obj = {};
console.log(obj.constructor === Object); // true
注意:constructor
属性可以被修改,因此它可能不是一个完全可靠的方法来检查对象的类型。
- Object.prototype.toString.call() 方法
这是一种更可靠的方式来获取对象的类型,因为它不会被对象的 toString
或 valueOf
方法覆盖。
let num = 123;
console.log(Object.prototype.toString.call(num)); // "[object Number]"
let str = "hello";
console.log(Object.prototype.toString.call(str)); // "[object String]"
let arr = [];
console.log(Object.prototype.toString.call(arr)); // "[object Array]"
let obj = {};
console.log(Object.prototype.toString.call(obj)); // "[object Object]"
let nullVal = null;
console.log(Object.prototype.toString.call(nullVal)); // "[object Null]"
let undef;
console.log(Object.prototype.toString.call(undef)); // "[object Undefined]"
你可以通过提取上述结果中的类型部分来进一步简化这个操作:
function getObjectType(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
console.log(getObjectType(num)); // "Number"
console.log(getObjectType(str)); // "String"
// ...以此类推
在实际开发中,你可以根据需要选择适合的方法来检查变量的类型。