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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.