首先 上面三种都是判断数据类型的 但是 typeof 判断基本数据类型 还是很准确的 但是 判断引用数据类型就不行了 请看示例:
function fn(a) {
return typeof a;
}
console.log(fn(123)); // number
console.log(fn("Hello")); // string
console.log(fn(true)); // boolean
console.log(fn(null)); // object
console.log(fn(undefined)); // undefined
console.log(fn({})); // object
console.log(fn([])); // object
console.log(fn(function b() {})); // function
从代码中看 这里要注意 对于 null
来说 虽然 typeof
返回的是 object
但实际上 null
是一种特殊的基本类型 而不是对象类型 这是 JavaScript 的历史遗留问题 对于其他基本类型(如字符串、数字、布尔值)和 undefined
typeof
可以给出准确的类型判断 但对于复杂的引用类型 typeof
有一些限制,无法准确判断其具体类型 在这种情况下 可以使用其他方法进行进一步的判断 例如 instanceof 那么请看示例:
function fn(obj, a) {
return obj instanceof a
}
console.log(fn("Hello", String)); // true
console.log(fn(123, Number)); // true
console.log(fn(true, Boolean)); // true
console.log(fn(null, Object)); // false
console.log(fn(undefined, Object)); // false
console.log(fn({}, Object)); // true
console.log(fn([], Array)); // true
console.log(fn(function () {}, Function)); // true
从上面的代码中 这里我只是写了一个简单的 instanceof 判断 不要在意 重点:instanceof
是 JavaScript 中的一个运算符 用于判断一个对象是否是某个构造函数(或者其原型链上)的实例 instanceof
运算符会检查左侧的 object
是否是右侧的 a 的实例 它会基于对象的原型链向上查找 如果在原型链上找到了指定的构造函数的 prototype
那么返回 true
否则返回 false
值得注意的是 对于基本数据类型 instanceof
运算符并不适用。它主要用于判断引用类型的实例关系。对于基本数据类型,可以使用 typeof
运算符进行判断