navigator.deviceMemory 常返回 undefined 最常见原因是非 HTTPS 环境,其次为 Safari/Firefox 不支持;需用 typeof 判断是否可用,并结合 hardwareConcurrency 等指标 fallback。

navigator.deviceMemory 可以读取设备的近似内存容量,但仅在 HTTPS 环境下可用,且返回值是四舍五入后的 GB 数(如 2、4、8),不是精确值,也不能触发权限弹窗或实时监听变化。
为什么 navigator.deviceMemory 经常返回 undefined
最常见原因是当前页面未运行在 HTTPS 协议下——HTTP 页面会直接忽略该属性。另一个容易被忽略的情况是:部分浏览器(如 Safari)至今未实现该 API,即使在 HTTPS 下也返回 undefined;Chrome 从 63 版本起支持,但仅限 secure context(即 HTTPS + 无降级混合内容)。
- 检查协议:
window.location.protocol必须为"https:" - 避免本地
file://打开,必须通过本地服务器(如python3 -m http.server)测试 - Safari 和 Firefox 当前不支持,不要依赖它做关键逻辑分支
如何安全读取并 fallback 到其他指标
不能直接 if (navigator.deviceMemory),因为未定义时会报错;也不能只靠它判断“低端机”,需结合 navigator.hardwareConcurrency 和 screen.availWidth 综合估算。
- 用
typeof navigator.deviceMemory === 'number'判断是否可用 - 典型 fallback:当
deviceMemory < 4或hardwareConcurrency <= 2时,可视为轻量设备 - 示例判断逻辑:
const isLowEndDevice = typeof navigator.deviceMemory === 'number' ? navigator.deviceMemory < 4 : (navigator.hardwareConcurrency || 1) <= 2;
它和 Performance.memory 的区别与误用风险
Performance.memory(如 memory.totalJSHeapSize)是 Chrome 特有、需开启 --enable-precise-memory-info 标志的调试接口,生产环境不可用,且已被标记为废弃。而 deviceMemory 是标准 API,但粒度粗、只读、无事件。
立即学习“前端免费学习笔记(深入)”;
-
Performance.memory在大多数生产环境会抛出SecurityError或直接undefined - 两者完全不互通:一个反映设备出厂内存等级,一个反映当前 JS 堆使用快照
- 切勿用
deviceMemory做内存泄漏监控或性能采样
真正能用的只有 navigator.deviceMemory 这个静态值,它适合做资源预加载分级(比如低内存设备默认加载 WebP 而非 AVIF),但别指望它能告诉你“现在还剩多少内存”。


















