news 2026/11/6 6:17:47

Mars 踩坑实录:Android 2.1 缺 Object.keys 时的两行 for-in 替代写法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mars 踩坑实录:Android 2.1 缺 Object.keys 时的两行 for-in 替代写法

Mars 踩坑实录:Android 2.1 缺 Object.keys 时的两行 for-in 替代写法

【免费下载链接】Mars腾讯移动 Web 前端知识库项目地址: https://gitcode.com/gh_mirrors/mar/Mars

维护低版本 Android 页面的人,大概率撞见过这样一个报错:Android 2.1 的内置浏览器还是老 WebKit 内核,直接调Object.keys(obj)会抛Uncaught TypeError: Object.keys is not a function,依赖键遍历的逻辑当场停摆。腾讯移动 Web 前端知识库 Mars 把这类对象遍历的坑记录在专门的 ES5 兼容速查里,修法其实一句话:换成 for-in 循环就行。这篇文章按"什么场景用哪种遍历方式"来拆。

先别急着上 polyfill:Android 2.1 到底缺了什么

⚠️ 动手之前,先看清环境缺的是哪些能力。Mars 仓库里的 ES5 移动端兼容性速查表 中,Android 2.1 那一列在Object.keys、Object.create、Array.isArray甚至Function.prototype.bind上基本全打 "no"。也就是说这不是孤立的一个点,而是整块 ES5 对象方法的能力空洞。

所以选型判断很简单:如果只是要"拿到一个对象的键名",for-in 一把梭足矣,没必要封装 polyfill;如果项目里Object.keys的调用点太多、不想逐个改,再考虑挂一个模仿原生的替代函数。

for-in + hasOwnProperty:最低版本对象遍历的写法

核心代码就三行:

var keys = []; for (var key in obj) { if (obj.hasOwnProperty(key)) keys.push(key); }

说白了,for-in 会走到所有可枚举键(包括原型链上继承来的),hasOwnProperty这一关就是只留对象自身的属性,跑完得到的数组和Object.keys(obj)等价。这个写法覆盖包括 Android 2.1 在内的所有环境,无依赖、无版本判断,是低版本浏览器做对象遍历的首选。

另外提一个坑:如果对象是Object.create(null)造的(没有原型链),它自己没有hasOwnProperty方法,上面这行会挂。稳妥的写法是Object.prototype.hasOwnProperty.call(obj, key)。

Object.keys polyfill 移动端怎么挂:只改两个分支

不想改项目里几十个调用点的话,包一层和原生同签名的替代函数即可。增强版相比上一节多出来的,其实是两个分支:

var objectKeys = function (obj) { var keys = []; if (Object.prototype.toString.call(obj) === '[object Array]') { for (var i = 0; i < obj.length; i++) keys.push(String(i)); } else { for (var key in obj) if (obj.hasOwnProperty(key)) keys.push(key); } return keys; };

完整版还会再多几行判断:原生Object.keys存在就直接委托,参数不是对象就抛TypeError。完整版本可以参考仓库 solutions/ 目录里的兼容实践。数组为什么要单独走下标?千个元素按索引逐个 push,比 for-in 遍历快,这是增强版提速的主要来源。

真机耗时数据怎么看:结论就一句话

Android 2.1 真机基准(遍历 100 个属性的对象、跑 1000 次):增强版比基础 for-in 快约三成,但两者都还在毫秒级,离高版本系统上原生Object.keys的 20ms 以内还有明显差距。两个手写版本的内存占用差异可以忽略。所以 polyfill 本身不用纠结微优化,真正的开销来源是把大对象遍历放进了渲染热路径,那才是该避开的。

上线前 checklist

  • 按兼容速查表逐项核对目标机型缺哪些方法,别默认"补一个就够了"
  • 入口处做特性检测(if (!Object.keys))再加载 polyfill,新设备上别白跑兼容代码
  • 低版本设备上,单次大对象遍历尽量分批或挪出首帧

【免费下载链接】Mars腾讯移动 Web 前端知识库项目地址: https://gitcode.com/gh_mirrors/mar/Mars

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 6:15:07

GSYVideoPlayer:Android 视频播放从接入到切换内核的实践笔记

GSYVideoPlayer&#xff1a;Android 视频播放从接入到切换内核的实践笔记 【免费下载链接】GSYVideoPlayer Video players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks,…

作者头像 李华
网站建设 2026/11/6 6:13:11

ARMv9 SCP电源管理服务深度解析:从架构原理到调优实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 6:10:38

OpenHarmony I2C驱动实战:从物理层到HDF排障全链路解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 6:08:31

GitHub热榜精选:五款易上手的效率工具与实操避坑指南

每周翻 GitHub Trending&#xff0c;差不多已经成了我的固定动作。9月16日这一期的榜单给我的感觉特别明显&#xff1a;AI 应用还在霸榜&#xff0c;但真正涨得猛的&#xff0c;反而是一批“看起来不性感”的本地效率工具——生活管理、画质替换、内存清理、论文转代码&#xf…

作者头像 李华
网站建设 2026/11/6 6:07:37

深度图头部姿态估计:从几何原理到实时部署的工程实践

简介&#xff1a;这份资源面向计算机视觉方向的学习者与开发者&#xff0c;聚焦基于深度图像的头部姿态估计这一课题&#xff0c;帮助读者理解俯仰角、翻滚角、偏航角三参数表示方法&#xff0c;以及特征点检测、模板匹配、机器学习与深度学习等主流技术路线在三维空间信息下的…

作者头像 李华
网站建设 2026/11/6 6:06:58

Navicat导入SQL文件到MySQL的完整指南

1. 准备工作&#xff1a;数据库环境与Navicat配置在开始导入SQL文件之前&#xff0c;我们需要确保数据库服务和Navicat客户端都处于正常工作状态。作为一款专业的数据库管理工具&#xff0c;Navicat支持多种数据库系统&#xff0c;包括MySQL、PostgreSQL、Oracle等。这里我们以…

作者头像 李华