新闻中心

J*aScript instanceof如何工作_它检查什么?

2025-12-14
浏览次数:
返回列表
instanceof 检查对象原型链是否包含构造函数的 prototype 对象,基于引用相等向上查找 [[Prototype]],不依赖 constructor 属性;原始值返回 false,null 无原型链,undefined 右侧非函数则报错;可由 Symbol.hasInstance 自定义行为。

javascript instanceof如何工作_它检查什么?

instanceof 检查的是对象的原型链上是否包含构造函数的 prototype 对象。

它不检查构造函数本身,也不检查对象的 constructor 属性

很多人误以为 instanceof 是看 obj.constructor === Ctor,其实不是。constructor 可以被随意修改,完全不可靠。instanceof 的判断依据只有一条:沿着 obj 的 __proto__(即内部 [[Prototype]])一路向上查找,看能不能找到 Ctor.prototype 这个对象。

  • 如果找到了,返回 true
  • 如果查到原型链尽头(null)都没找到,返回 false
  • 要求右边必须是函数(否则抛错),左边可以是任意值(非对象会直接返回 false)

原型链查找是基于引用相等,不是值相等

instanceof 不关心 Ctor.prototype 上有什么属性或方法,只关心“是不是同一个对象”。哪怕两个函数有完全一样的 prototype 内容,只要不是同一个对象实例,就不会匹配。

例如:

美图AI开放平台 美图AI开放平台

美图推出的AI人脸图像处理平台

美图AI开放平台 111 查看详情 美图AI开放平台
function A() {}
function B() {}
B.prototype = Object.create(A.prototype); // 继承 A
const b = new B();
console.log(b instanceof A); // true —— 因为 B.prototype.__proto__ === A.prototype
console.log(b instanceof B); // true —— 因为 b.__proto__ === B.prototype

注意 null、undefined 和原始值的行为

原始值(如字符串、数字、布尔)用 instanceof 总是返回 false,因为它们不是对象,没有原型链:

  • "hello" instanceof Stringfalse
  • new String("hello") instanceof Stringtrue
  • null instanceof Objectfalse(null 没有原型链)
  • undefined instanceof Object → 报错(右侧必须是函数)

ES6 之后可自定义 Symbol.hasInstance

如果构造函数上定义了静态方法 [Symbol.hasInstance](obj),instanceof 就会调用它,而不是走默认原型链查找。这是少数能覆盖默认行为的方式。

class MyArray {
  static [Symbol.hasInstance](obj) {
    return Array.isArray(obj) || (obj && typeof obj.length === 'number');
  }
}
console.log([1,2] instanceof MyArray); // true
console.log({length: 5} instanceof MyArray); // true
基本上就这些。instanceof 的核心就是原型链上的引用查找,简单但容易忽略细节。

以上就是J*aScript instanceof如何工作_它检查什么?的详细内容,更多请关注其它相关文章!


# 有何不同  # seo中国女  # 搞网站建设赚钱不  # 沈阳seo营销怎么操作  # 街道建设画册模板下载网站  # 五粮液再推广营销  # 鲜牛奶推广营销策划方案  # 海南seo招商加盟  # 杭州网站建设服务网站  # 鞋网站推广好吗  # 雄安网站建设单位  # 器中  # javascript  # 这是  # 拖拽  # 的是  # 服务端  # 表单  # 报错  # 自定义  # 美图  # java  # es6 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  离线运行Go语言之旅:本地部署与GOPATH配置指南  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  Go语言中动态执行代码字符串的策略与实践  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  在VS Code中配置和运行Dart程序的完整步骤  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  小红书网页版入口链接分享 小红书官网直接进  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  邮政快递单号查询入口 邮政快递物流信息在线查询入口  Bing引擎入口最新2025 Bing搜索免费官方登录  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  谷歌google账号注册详细步骤 谷歌账号注册官方教程  J*a中实现Go语言select通道多路复用机制  Flexbox布局实践:实现粘性导航栏与底部固定页脚  J*a递归快速排序中静态变量的状态管理与陷阱  理解Python模块与全局变量的作用域管理  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  自定义Bag-of-Words实现:处理带负号的词汇权重  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  58动漫网在线官方网 58动漫网正版动漫入口网址  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  c++如何使用Meson构建系统_c++比CMake更快的构建工具  Pandas DataFrame 多条件优先级排序与排名  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  深入理解Go语言中的指针类型:以*string为例  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  C++如何比较两个字符串_C++ string compare函数与操作符对比  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  深入理解与实现最大堆的Heapify过程:常见错误与修正  Python实现多节点属性重叠度分析教程  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  J*aScript数组对象转换:按指定键分组与值收集  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  b站赚钱渠道_b站收益来源  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南 

搜索