前端知识速记--JS篇:instanceof

前端知识速记--JS篇:instanceof

在JavaScript中,instanceof运算符用于检测一个对象是否是另一个对象的实例。它的基本语法为:obj instanceof Constructor。如果objConstructor的实例,它将返回true,否则返回false。这是一个判断对象的原型链上是否存在构造函数的prototype属性的简单方法。

1. instanceof的基本用法

示例

javascript 复制代码
function Animal() {}
function Dog() {}

Dog.prototype = Object.create(Animal.prototype);

const dog = new Dog();

console.log(dog instanceof Dog);       // true
console.log(dog instanceof Animal);    // true
console.log(dog instanceof Object);     // true
console.log(dog instanceof Array);      // false

在上述代码中:

  • dog instanceof Dog 返回true,因为dogDog的实例。
  • dog instanceof Animal 也返回true,因为Dog继承自Animaldog通过原型链链接到Animal
  • dog instanceof Object 返回true,因为所有对象都是Object的实例。
  • dog instanceof Array 返回false,因为dog并非Array的实例。

2. instanceoftypeof的比较

typeof的特点

typeof运算符用于获取变量的数据类型,它的语法为:typeof variable。返回的结果是一个字符串,表示变量的数据类型。它有局限性,尤其在判断null时:

javascript 复制代码
console.log(typeof null);  // "object"

为什么typeof null返回"object"

这是JavaScript语言设计中的一个历史遗留问题。在最初的JavaScript版本中,所有对象的类型都被定义为对象,并且在内存中null的表示方式也是以对象的形式。因此,当typeof检查到null时,它看到了对象的表示,返回了"object"。这个行为虽然被广泛认为是一个 bug,但在后续版本中为了兼容性并未被更改。

instanceof对比

  • instanceof专注于对象的类型(即原型链),能够准确判断对象是否为某个构造函数的实例。
  • typeof适用于 primitive value 和一些非对象类型,但因为历史原因对null处理不当,使其在类型判断上显得薄弱。
javascript 复制代码
const value = null;
console.log(typeof value);               // "object"
console.log(value instanceof Object);     // false

在这个例子中,虽然typeof null返回object,但是instanceof运算符却正确地反映出null并不是一个对象实例,因为它没有原型链。

3. 经典问题

经典问题:如何判断一个变量既不是null也不是数组?

使用instanceoftypeof结合的方式,可以有效判断:

javascript 复制代码
function isObject(value) {
    return value !== null && typeof value === 'object';
}

console.log(isObject([]));       // true
console.log(isObject({}));       // true
console.log(isObject(null));     // false
console.log(isObject(42));       // false

该函数定义了在判断对象之前,先排除了null的情况。

相关推荐
故事和你911 分钟前
洛谷-算法2-2-常见优化技巧3
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
苏一恒2 分钟前
MP4 在 <video> 里,必须全量下载才能起播吗?—— moov、Range 与被误解的 FastStart
前端
foundbug9994 分钟前
MATLAB时频分析工具箱:基于FRFT的信号检测与参数估计
开发语言·matlab
DevilSeagull6 分钟前
Rust 方法语法:从定义到实践
开发语言·后端·rust
charlie1145141916 分钟前
通用GUI编程技术——图形渲染实战(三十七)——D3D11初始化与SwapChain:从零搭建GPU渲染框架
开发语言·c++·3d·图形渲染
陈天伟教授6 分钟前
GPT Image 2-城市海报
开发语言·人工智能·gpt·神经网络
原来是猿7 分钟前
线程安全的单例模式
linux·服务器·开发语言·单例模式·策略模式
charlie1145141917 分钟前
通用GUI编程技术——图形渲染实战(三十六)——Constant Buffer与数据传递:CPU-GPU通信通道
开发语言·c++·windows·c·图形渲染·win32
南境十里·墨染春水10 分钟前
C++笔记 STL lterator迭代器
开发语言·c++·笔记
Java小卷11 分钟前
低代码并没有过时!可拖拽表单设计器布局思路
前端·低代码