V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
anjianshi
V2EX  ›  JavaScript

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

  •  
  •   anjianshi · 2016-04-03 21:26:46 +08:00 · 3392 次点击
    这是一个创建于 3163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    3 条回复    2016-04-03 22:36:49 +08:00
    wssgcg1213
        1
    wssgcg1213  
       2016-04-03 21:47:29 +08:00   ❤️ 1
    os x 下的 safari 也有这个问题
    anjianshi
        2
    anjianshi  
    OP
       2016-04-03 21:53:37 +08:00
    @wssgcg1213 多谢,看来应该跟 iOS 无关,是 Safari 的问题
    cpylua
        3
    cpylua  
       2016-04-03 22:36:49 +08:00   ❤️ 1
    可能是 ios9 和 OS X El Capitan, iOS8 和 Yosemite 的 Safari 都没有问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.