Skip to content

typeof 是否能正确判断类型?

参考答案:

对于原始类型来说,除了 null 都可以调用typeof显示正确的类型。

js
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'

但对于引用数据类型,除了函数之外,都会显示"object"。

js
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'

因此采用typeof判断对象数据类型是不合适的,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true

js

const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str1 = 'hello world'
str1 instanceof String // false
var str2 = new String('hello world')
str2 instanceof String // true

题目要点:

typeof 是 JavaScript 中用于返回一个值的数据类型的一元操作符。它对于基本数据类型的判断通常是准确的,但在某些情况下可能不会返回你期望的结果。

基本数据类型的判断

javascript
typeof undefined;  // "undefined"
typeof 42;         // "number"
typeof "Hello";     // "string"
typeof true;       // "boolean"
typeof null;       // "object" —— 这是一个常见的陷阱
typeof Symbol();   // "symbol"

对象和数组的判断

js
typeof {};            // "object"
typeof [];            // "object" —— 数组是对象的一种类型
typeof new Date();    // "object" —— Date 对象是对象的一种类型
typeof function() {}; // "function" —— 函数在 JavaScript 中被归类为对象

typeof 的限制

  • null 的问题:typeof null 返回 "object",因为 null 被视为一个空的对象引用。
  • 函数问题:尽管函数是对象,typeof 会返回 "function"。 不能区分对象类型:typeof 无法区分数组、日期对象、自定义对象等,因为它们都被归类为 "object"。
  • 不同上下文的对象:来自 iframe 或服务端动态加载的脚本创建的对象可能无法被 typeof 正确判断。
  • 未定义的变量:对未声明的变量使用 typeof 会导致 ReferenceError。

总结

typeof 可以正确判断基本数据类型,但在处理复杂对象时可能有限制。如果需要更细致的类型检查,可以使用 instanceof 操作符或 Object.prototype.toString.call() 方法。

js
// 使用 instanceof 进行更细致的类型检查
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true

// 使用 Object.prototype.toString.call 检查对象的具体类型
console.log(Object.prototype.toString.call(new Date())); // "[object Date]"
console.log(Object.prototype.toString.call(function(){})); // "[object Function]"

instanceof 和 Object.prototype.toString.call 是处理复杂类型判断时的有用工具,它们可以提供更精确的结果。