直接查运行时能力,别碰 navigator.useragent——它不可靠且解决不了真实问题;应优先用'in'检测全局api是否挂载、typeof===function判断构造函数可用性、document.createelement+方法检查html元素行为、css.supports()验证css特性。

直接查运行时能力,别碰 navigator.userAgent —— 它既不可靠,也解决不了真实问题。
用 in 检测全局 API 是否挂载
大多数 HTML5 新增的全局对象或方法(如 fetch、IntersectionObserver、localStorage)都直接挂在 window 上。检测它们是否存在,in 是最轻量、最安全的方式:
-
'fetch' in window✅ —— 推荐,不触发访问器、不因未声明变量报错 -
typeof fetch !== 'undefined'❌ —— 在某些老 Safari 或严格模式下可能抛ReferenceError -
'onbeforeinstallprompt' in window✅ —— 事件名也是属性,同样适用 - 注意大小写:
'resizeobserver' in window返回false,必须写'ResizeObserver' in window
用 typeof === 'function' 判断构造函数是否可用
像 Promise、AbortController、Intl.DateTimeFormat 这类是构造函数,光存在还不够,值还可能是 null 或 undefined(尤其在 polyfill 混用或降级环境里):
-
typeof Promise === 'function'✅ —— 必须确认是函数类型 -
typeof Intl?.DateTimeFormat === 'function'✅ —— 用可选链防Intl本身不存在 -
'Promise' in window不够 —— IE11 中它存在但值为undefined,new Promise()会直接崩
用 document.createElement() + 方法检查判断 HTML 元素行为支持
标签能被解析 ≠ 行为可用。比如 dialog 在 Safari 16.0–16.3 中能创建元素、有 showModal(),但调用 close() 不触发 close 事件 —— 这种“半支持”只靠 in 检不出:
-
'showModal' in document.createElement('dialog')✅ —— 比instanceof HTMLDialogElement更早暴露问题 -
typeof HTMLDialogElement !== 'undefined'✅ —— 更可靠,Safari 16.0–16.3 返回undefined,而in可能返回true -
const el = document.createElement('div'); el.inert = true; 'inert' in el✅ —— 属性检测要设在实例上,不能查document.body.inert
用 CSS.supports() 验证 CSS 特性是否真生效
CSS 新特性(如 aspect-ratio、container-type、inset)无法靠 JS 对象判断,必须走 CSSOM 接口:
-
CSS.supports('display', 'grid')✅ —— 参数必须是字符串,漏引号就失效 -
CSS.supports('inset: 10px')✅ —— 支持单参数语法,适合逻辑属性 - Safari 直到 15.4 才支持
CSS.supports(),旧版会报undefined is not a function -
CSS.supports()返回true≠ 渲染正常 —— 早期 Chrome 支持@container语法但实际不触发容器查询,得加视觉 fallback
真正难的不是写检测语句,而是识别“看似支持实则残缺”的边界情况:API 存在但调用就崩、CSS 支持但布局错位、事件注册了却永远不触发。每次加检测前,先在目标浏览器里 console.log 看一眼原型链和返回值,比查文档快得多。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











