iOS 10.3.3 Safari中对象{1:Infinity,1000:Infinity}转换异常原因咨询
关于iOS 10.3.3 Safari中对象异常转换的原因解析
这确实是iOS 10.3.3版本Safari专属的一个JavaScript引擎bug,根源在于当时WebKit内核的JavaScriptCore引擎对类数组对象的识别逻辑存在漏洞,具体机制如下:
- 类数组对象的误判逻辑:在这个版本的JavaScriptCore里,当对象包含数值类型的键,且最大键值和已存在键的数量差距过大时(比如你的例子里只有2个键,但最大键是1000),引擎会错误地将其判定为类数组对象。一旦被判定为类数组,引擎就会尝试枚举从
0到最大键值的所有索引位置。 - 未定义索引的错误转换:对于那些原本不存在的索引(比如
0、2到999),引擎会默认尝试读取这些位置的值,而因为对象本身没有这些键,原本应该返回undefined,但在调试展示或某些序列化场景下,引擎错误地将undefined转换成了NaN——这可能是由于内部数值转换逻辑的失误导致的。 - 仅特定环境触发:这个bug只存在于iOS 10.3.3的Safari(对应WebKit的特定旧版本),后续苹果推送的iOS更新和WebKit内核迭代都修复了这个类数组识别的逻辑漏洞,所以其他新环境不会出现这个问题。
临时兼容方案
如果需要覆盖这部分小众用户,有两个简单的解决办法:
- 将对象的数值键转换为字符串键,比如写成
{"1": Infinity, "1000": Infinity},这样引擎就不会误判为类数组对象; - 避免在对象中使用跨度极大的数值键,尽量保持键的连续性,或者改用数组+空位处理(但要注意数组空位的行为差异)。
内容的提问来源于stack exchange,提问作者Alex Vargas.
相关产品推荐
相关产品推荐

