iOS 下, Object.defineProperty 的奇怪行为,这是不是 Safari 的 bug?

2016-04-03 21:26:46 +08:00
 anjianshi

https://jsfiddle.net/smfod698/1/

var m = '123'.match(/123/)
alert(m.slice(0))

function Cls() {
    Object.defineProperty(Cls.prototype, "1", {})
}
new Cls()

var m2 = '123'.match(/123/)
alert(m2.slice(0))

调用 Object.defineProperty(),导致 array.slice() 返回的结果变得不正常了。
上面的代码,在我的 iPad (iOS 9.2.1)上运行,前一个对话框正常输出 123 ,后一个就只输出空字符串了。

而且只有当调用 Object.defineProperty() 时传入的是自然数格式的字符串时,才会发生这个问题。
例如: "0"、"1"、"1000",一直到 "4294967294" 都能触发此问题。 而 "00" 就不会。

我也测试了 Android 、 Windows 上的浏览器,都没有这个问题。
现在手头只有一个 iPad ,不知道在其他 iOS 设备上是不是有这个问题。
有大神知道这是怎么回事吗?

P.S.
Object.defineProperty 那段代码来自 Immutable.js 中对 Record 的定义。
'string'.match(/reg/).slice() 来自 react-router 中匹配路由的代码。
我的应用里同时使用了这两个类库,然后刚好又给 Record 定义了一个数字格式的字段,然后就发现路由不正常了,调试了一下午才把这个问题给揪出来 orz

3210 次点击
所在节点    JavaScript
3 条回复
wssgcg1213
2016-04-03 21:47:29 +08:00
os x 下的 safari 也有这个问题
anjianshi
2016-04-03 21:53:37 +08:00
@wssgcg1213 多谢,看来应该跟 iOS 无关,是 Safari 的问题
cpylua
2016-04-03 22:36:49 +08:00
可能是 ios9 和 OS X El Capitan, iOS8 和 Yosemite 的 Safari 都没有问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/268357

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX