返回

typeof、instanceof、Object.prototype.toString:揭示JavaScript类型检查的艺术

前端

揭开类型检查的面纱:JavaScript 中的神奇三剑客

在 JavaScript 的浩瀚世界中,类型检查是掌握语言精髓的关键。就像武侠小说中的三把神兵利器,typeof、instanceof 和 Object.prototype.toString 各有妙用,助你探究变量和对象的类型之谜。

1. typeof:揭示变量类型的本质

typeof 运算符宛如一名无所不知的侦探,揭示着变量的真实身份。它返回一个字符串,宣告着变量的类型归属。就如同侦探的手电筒,将隐藏在黑暗中的秘密照亮。

console.log(typeof 123); // "number"
console.log(typeof "Hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object"

typeof 运算符的返回值分为六种:

  • "number":数字类型
  • "string":字符串类型
  • "boolean":布尔类型
  • "undefined":未定义类型
  • "object":对象类型
  • "function":函数类型

不过,对于 null 值,typeof 运算符的处理有些特殊。虽然 null 在 JavaScript 中属于对象,但 typeof 却返回 "object"。这是因为 null 是一个特殊的对象,不属于任何类,也没有原型。

2. instanceof:探索对象的血统

instanceof 运算符宛如一位资深寻根问祖者,探寻着对象的家族渊源。它检查一个对象是否属于某个特定家族。就如同追溯祖谱,instanceof 沿着对象的原型链向上溯源。

function Person(name) {
  this.name = name;
}

const person = new Person("John");

console.log(person instanceof Person); // true
console.log(person instanceof Object); // true

instanceof 运算符返回一个布尔值,回答着归属与否的疑问。如果对象属于指定的家族,则返回 true;否则,返回 false。

instanceof 运算符的原理在于原型链的逐级追溯。每个对象都有一个原型对象,原型对象也有一个原型对象,层层递进。instanceof 沿着这条链路向上寻找,直到找到指定的家族或到达 Object 类。如果在追溯过程中发现指定家族的踪迹,则返回 true;否则,返回 false。

3. Object.prototype.toString:探究对象的本质

Object.prototype.toString 方法仿佛一位精明的化验师,揭示着对象的深层本质。它返回一个字符串,宣告着对象的类型归属。就如同通过化学分析确定物质的组成,Object.prototype.toString 深入探究对象的内部构造。

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

Object.prototype.toString 方法的返回值是一个字符串,格式为 "[object Type]】。通过解析这个字符串,我们可以洞悉对象的类型归属。

结语

typeof、instanceof 和 Object.prototype.toString 是 JavaScript 中的三位类型检查利器,它们齐心协力,助你掌握变量和对象的类型之谜。了解它们的妙用,犹如拥有三把神兵在手,纵横 JavaScript 世界,所向披靡。

常见问题解答

  1. typeof 和 Object.prototype.toString 有何区别?

typeof 返回一个简短的类型字符串(例如,"number"、"string"),而 Object.prototype.toString 返回一个更详细的字符串(例如,"[object Number]"、"[object String]")。

  1. instanceof 和 Object.prototype.toString 有何区别?

instanceof 检查一个对象是否属于某个特定类,而 Object.prototype.toString 返回对象的类型字符串。

  1. 如何检查一个数组?

可以通过 Array.isArray() 方法检查一个数组,它返回一个布尔值,表示是否为数组。

  1. 如何检查一个正则表达式?

可以使用正则表达式的 constructor 属性,它指向 RegExp 类。例如:

console.log(/pattern/.constructor === RegExp); // true
  1. 如何检查一个 DOM 元素?

可以通过 Node.js 的 isElement() 方法检查一个 DOM 元素。例如:

console.log(isElement(document.getElementById("myElement"))); // true