instanceof和typeof的区别【JavaScript常见面试题】

embedded/2025/2/26 2:08:58/

typeof (一元操作符):

用于判断一个变量的类型。它可以用于任何数据类型,并返回一个表示该类型的字符串。

javascript">console.log(typeof 42);         // "number"
console.log(typeof 'Hello');    // "string"
console.log(typeof true);       // "boolean"
console.log(typeof undefined);  // "undefined"
console.log(typeof null);       // "object" (这是一个历史遗留的bug)
console.log(typeof { a: 1 });   // "object"
console.log(typeof [1, 2, 3]);  // "object" (数组在JavaScript中也是对象)
console.log(typeof function(){}); // "function"
  1. 数字类型:typeof 返回的值是 number。
  2. 字符串类型:typeof 返回的值是 string。
  3. 布尔类型:typeof 返回的值是 boolean。
  4. 对象、数组、null 返回的值是 object:如 typeof(window),typeof(document),typeof(null)
  5. 函数类型,返回的值是 function:如:typeof(eval),typeof(Date)返回的值都是 function。
  6. 不存在的变量、函数或者 undefined,将返回 undefined:比如:typeof(abc)、typeof(undefined)
    都返回 undefined

instanceof (二元操作符):

用于检测某个对象是否是另一个对象的实例,或者说某个对象是否存在于另一个对象的原型链上。

javascript">class Animal {}
class Dog extends Animal {}const dog = new Dog();console.log(dog instanceof Dog);    // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true (所有对象都是Object的实例)console.log([] instanceof Array);   // true
console.log({} instanceof Object);  // true
  1. instanceof 用于检测对象类型,不适用于基本数据类型(会报错)。
  2. 通过原型链来判断,如果对象的原型链上包含某个构造函数的 prototype 属性,则返回 true。
  3. 可以用于区分对象和数组,因为 Array 是一个构造函数,而 [] instanceof Array 返回 true。

instanceof 和 typeof 进行类型判断的对比示例:

示例 1:基本数据类型:

javascript">let num = 42;
console.log(typeof num); // "number"
// console.log(num instanceof Number); // 错误,基本数据类型不能用instanceoflet str = "Hello";
console.log(typeof str); // "string"
// console.log(str instanceof String); // 错误,基本数据类型不能用instanceoflet bool = true;
console.log(typeof bool); // "boolean"
// console.log(bool instanceof Boolean); // 错误,基本数据类型不能用instanceof

typeof 可以正确地判断基本数据类型(number、string、boolean),而 instanceof 不适用于基本数据类型,尝试使用会导致错误。

示例 2:对象和数组:

javascript">let obj = { a: 1 };
console.log(typeof obj); // "object"
console.log(obj instanceof Object); // truelet arr = [1, 2, 3];
console.log(typeof arr); // "object" (数组在JavaScript中也是对象)
console.log(arr instanceof Array); // true

在这个示例中,typeof 对于对象和数组都返回 “object”,无法区分它们。而 instanceof 可以准确地判断 obj 是 Object 的实例,arr 是 Array 的实例。

示例 3:函数:

javascript">function myFunc() {}
let func = myFunc;console.log(typeof func); // "function"
// console.log(func instanceof Function); // 在某些环境中可能返回true,但这不是标准用法

对于函数类型,typeof 可以准确地返回 “function”。而 instanceof 对于函数类型的判断并不是标准用法,虽然在某些JavaScript环境中 func instanceof Function 可能会返回 true,但这并不是普遍推荐的做法。

示例 4:自定义类和实例:

javascript">class Person {}
let person = new Person();console.log(typeof person); // "object"
console.log(person instanceof Person); // true
console.log(person instanceof Object); // true (因为所有类都继承自Object)

在这个示例中,typeof 对于自定义类的实例只能返回 “object”,而 instanceof 可以准确地判断 person 是 Person 类的实例,同时也是 Object 的实例(因为所有类都隐式继承自 Object)。

总结:

  • typeof 适用于判断基本数据类型和函数类型。
  • instanceof 适用于判断对象类型,包括自定义类和内置构造函数创建的实例。
  • 当需要区分对象和数组时,应使用 instanceof。
  • 对于基本数据类型,只能使用 typeof,不能使用 instanceof。

http://www.ppmy.cn/embedded/167170.html

相关文章

Spring Boot + JSqlParser:全面解析数据隔离最佳实践

Spring Boot JSqlParser:全面解析数据隔离最佳实践 在构建多租户系统或需要进行数据权限控制的应用时,数据隔离是一个至关重要的课题。不同租户之间的数据隔离不仅能够确保数据的安全性,还能提高系统的灵活性和可维护性。随着业务的扩展和需…

python和pycharm 和Anaconda的关系

好的,下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系,并逐一解释它们的功能和作用。 1. Python(编程语言) 定义:Python 是一种高级编程语言,设计简洁,易于学习,且功能强…

LeetCode 贪心算法经典题目 (C++实现)

121. 买卖股票的最佳时机 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返…

跟着柳叶刀数字健康,学习如何通过病理切片预测分子分类对预后的影响|项目复现

小罗碎碎念 项目复现 今天和大家分享一个非常具有参考价值的项目,手把手带着大家复现一篇发表在柳叶刀数字健康的文章。 花了六个小时才完成的这篇推送,信息量非常大,遇到了很多报错问题,但是解决以后的感觉是非常爽的,先给大家展示一下最终的成果——在同一张切片上,通…

Python的子线程与主线程之间的通信并通知主线程更新UI

新建PLC类 PLC.py import json import time from threading import Threadfrom HslCommunication import SiemensS7Net, SiemensPLCS from PySide6.QtCore import QThread, Signal, QObjectfrom tdm.MsgType import MSG_TYPE_LOG, MSG_TYPE_MSGBOX# 自定义信号类,用…

ubuntu开机自动挂载硬盘

在Ubuntu中实现硬盘自动挂载,可通过以下步骤完成: 1.获取硬盘UUID和文件系统类型 sudo blkid /dev/sdX1 # 替换为你的硬盘分区(如sdb1)记录输出的UUID和TYPE(如ext4/ntfs)。 2. 创建挂载目录 sudo mkdi…

Java 常见的面试题(Hibernate)

一、为什么要使用 hibernate? 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作hibernate使用Java反射机制&#xf…

【网络安全】从零开始的CTF生活

1、CTF是什么? CTF(Capture The Flag,夺旗赛)起源于 1996 年 DEFCON 全球大会,是网络安全爱好者之间的竞技游戏。 2、比赛怎么打? 1、解题模式: 与ACM编程竞赛、信息学奥赛类似,…