urlname
type
Post
password
SyncToConfluence
category
编程基础
date
May 13, 2024
slug
01HXPYMBMXH4A54AKDKRTAHM5X
icon
Button
catalog
summary
tags
JavaScript
编程语言
cover
Status
BusyTime
Status 1
status
Published
😀
在 JavaScript 的日常开发中,了解和使用 typeofinstanceof 是处理类型检测的关键。这两个操作符虽然简单,但是了解它们的细节可以帮助我们写出更健壯和可靠的代码。

typeof 操作符

  • typeof 是一个一元操作符,用于检测一个变量的数据类型。它的语法十分简单:
  • 这里是 typeof 的一些基本用法和返回值示例:
    • typeof 123 返回 "number"
    • typeof 'jartto' 返回 "string"
    • typeof true 返回 "boolean"
    • typeof undefined 返回 "undefined"
    • typeof {name: 'jartto'} 返回 "object"
    • typeof [1,2,3] 返回 "object"
    • typeof new Function() 返回 "function"
    • typeof null 返回 "object"

注意事项:

  • 基本类型: 对于基本数据类型(除了 null),typeof 能准确返回类型。
  • 引用类型: 对于对象和数组,typeof 均返回 "object",这使得它在判断数组和普通对象时不够精确。
  • 函数类型:对函数的检测结果为"function"
  • null 的特殊情况: typeof null 的结果为 "object",这是一个历史遗留的bug,需要特别注意。
  • 未声明的变量: typeof 可以判断出未声明的变量,并返回"undefined"
    • ES6 的暂时性死区: 使用 letconst 声明的变量在声明前访问会产生引用错误,即使是在 typeof 操作中。

    instanceof 操作符

    • instanceof 是用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
    • 它的表达式如下:
    • 如果对象继承自构造函数的原型,则返回 true,否则返回 false。以下是一些常见示例:
      • [] instanceof Array 返回 true
      • {} instanceof Object 返回 true
      • new Date() instanceof Date 返回 true
      • new Person() instanceof Object 返回 true

    关于原型链:

    当检查 instanceof 时,JavaScript 会沿着对象的原型链向上寻找,直到找到对应的原型或到达原型链的末端(null)。例如:

    扩展知识和常见问题

    • 数组的检测: 由于 typeof 对数组返回 "object",更好的数组检测方法是使用 Array.isArray([])
    • 闭包中的变量提升: 在闭包中由于变量提升,即使内部变量未定义,typeof 也不会报错,但会返回 "undefined"

    总结

    typeofinstanceof 都是非常有用的工具,但它们有各自的适用场景和局限性。typeof 适合基本类型的检测和判断变量是否声明,而 instanceof 更适合检查对象的类型和实现基于原型的继承检查。理解这些操作符的内部机制,可以帮助我们更精确地控制代码和避免常见的陷阱。

    参考\推荐

    JavaScript——prototype与__proto__TypeScript——类型基础
    Loading...