JavaScript中的类型判断(三)—— 用于判定对象类型的4种方法

138 阅读2分钟

1. typeof

typeof是一元运算符,可以用来返回一个变量或表达式的数据类型。它可以准确地判断除null之外的原始类型,并且可以判断function类型。

代码示例:

console.log(typeof "hello"); // 输出: "string"
console.log(typeof 123); // 输出: "number"
console.log(typeof true); // 输出: "boolean"
console.log(typeof undefined); // 输出: "undefined"
console.log(typeof null); // 输出: "object" (这是一个历史遗留问题)
console.log(typeof Symbol(123))//输出: "symbol"
console.log(typeof 123n); // 输出: "bigint"

console.log(typeof function(){}); // 输出: "function"

以上关于原始类型和引用类型详细请看请看JavaScript中的类型判断(一)——原始类型和引用类型

2. instanceof

instanceof运算符用于判断一个对象是否是某个构造函数(或其子类)的实例,只能判断引用类型。它通过原型链的查找来判断对象的类型。

代码示例:

let arr = [1, 2, 3];
console.log(arr instanceof Array); // 输出: true
console.log(arr instanceof Object); // 输出: true
console.log(arr instanceof RegExp); // 输出: false

function Person() {}
let p = new Person();
console.log(p instanceof Person); // 输出: true
console.log(p instanceof Object); // 输出: true
console.log(p instanceof Array); // 输出: false

以上关于instanceof方法详细请看JavaScript中的类型判断(二)——instanceof与Object.prototype.toString.call()

3. Object.prototype.toString.call()

Object.prototype.toString()方法可以返回一个对象的字符串表示形式。它会读取数据结构内部属性来读取数据的类型 class。通过调用call()方法,可以改变toString()中this的指向,使其返回"[object 类型]"的形式,其中类型可以是任意数据类型。

代码示例:

console.log(Object.prototype.toString.call("hello")); // 输出: "[object String]"
console.log(Object.prototype.toString.call(123)); // 输出: "[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(function(){})); // 输出: "[object Function]"
console.log(Object.prototype.toString.call([])); // 输出: "[object Array]"
console.log(Object.prototype.toString.call({})); // 输出: "[object Object]"

以上关于Object.prototype.toString()方法详细请看JavaScript中的类型判断(二)——instanceof与Object.prototype.toString.call()

4. Array.isArray()

Array.isArray()方法用于判断一个对象是否为数组,且只能判断数组类型。

代码示例:

console.log(Array.isArray([1, 2, 3])); // 输出: true
console.log(Array.isArray({length: 3, 0: "a", 1: "b", 2: "c"})); // 输出: false
console.log(Array.isArray("hello")); // 输出: false

需要注意的一点是:typeof、instanceof和Array.isArray()对于自定义的引用类型可能会出现误判,因此判断引用类型最好使用Object.prototype.toString.call()方法。