Device Memory API 返回 undefined 是因仅 HTTPS 或 localhost 安全上下文下可用,Safari 未实现;返回值为向下取整的 GB 数(如 3.7GB → 3.0),宜用范围判断而非严格相等。

Device Memory API 返回 undefined 怎么办
多数情况下,navigator.deviceMemory 读出来是 undefined,不是 bug,是规范明确要求的——该 API 只在 HTTPS 环境下可用,且部分浏览器(如 Safari)至今未实现。Chrome 和 Edge(基于 Chromium)支持,但仅限安全上下文(即 HTTPS 或 localhost)。
实操建议:
- 先检查协议:
window.location.protocol必须为"https:"或"http:"且主机为"localhost" - 不要用
file://协议本地双击打开 HTML,它不构成安全上下文 - 开发时可用
python3 -m http.server 8000起一个本地 HTTP 服务来测试 - 务必加防御性判断:
if ('deviceMemory' in navigator) { ... },避免报TypeError
Device Memory 的返回值单位和精度
navigator.deviceMemory 返回的是以 GB 为单位的近似值,但**只保留一位小数,且向下取整**。比如真实内存为 3.7GB 的设备,API 返回 3.0;8GB 设备返回 8.0;而 16GB 设备可能返回 8.0 或 16.0,取决于厂商上报策略和系统抽象层。
这意味着它不适合做精确内存判断,只适合粗粒度分层:
立即学习“前端免费学习笔记(深入)”;
-
0.5→ 极低端(常见于旧款 Android Go 设备) -
1.0–2.0→ 低端 -
4.0–8.0→ 中端 -
16.0+ → 高端(但实际极少返回 >8.0)
别对 deviceMemory === 4.0 写严格相等逻辑,建议用范围判断:navigator.deviceMemory 表示低内存设备。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
结合 performance.memory 做交叉验证?别试了
performance.memory(含 totalJSHeapSize 等)在 Chrome 中已被移除(自 Chrome 93 起),现在访问会直接抛 TypeError: Cannot read properties of undefined。即使旧版能读,它反映的是 JS 堆内存使用情况,和物理内存无关,两者完全不等价。
目前没有标准 Web API 能可靠获取真实物理内存。替代思路只有:
- 用
navigator.deviceMemory做启发式降级(如关闭动画、降低图片分辨率) - 结合
navigator.hardwareConcurrency判断 CPU 核心数,辅助识别低端设备 - 通过
requestIdleCallback或首屏渲染耗时等运行时指标反推设备能力
面试被问“怎么检测低端设备”,别只答 Device Memory
面试官真正想确认的是你是否理解「Web 环境下无法直接读取硬件信息」这一前提,以及是否有分层兜底意识。只提 navigator.deviceMemory 是单点答案,容易被追问失效场景。
更务实的回答结构是:
- 首选
navigator.deviceMemory(说明条件、精度、典型值) - 降级用
navigator.hardwareConcurrency(≤2 表示极弱 CPU) - 再降级看
screen.width × screen.height和window.devicePixelRatio组合,排除高分屏低性能假象 - 最后用运行时指标:首次
paint时间 >1s 或First Contentful Paint>2s,可视为实际体验卡顿
真实项目里,这四个维度常组合成一个 getDeviceTier() 函数,而不是依赖某一个字段。

















