首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

一个 JavaScript 挑战题,检测隐形人是否存在~

  •  
  •   mytry · 336 天前 · 2394 次点击
    这是一个创建于 336 天前的主题,其中的信息可能已经有所发展或是发生改变。

    检测 Math 对象是否被 Proxy 拦截。(如果有打印 hooked,期望得到 true ;没有则 false )

    在线代码: https://jsfiddle.net/8sdugz9r/

    答案有多个,当然越简单越好~

    15 回复  |  直到 2018-11-21 17:02:36 +08:00
        1
    meepo3927   336 天前
    if (Math.random() < 0.5)

    是何作用 ?
        2
    mytry   336 天前
    @meepo3927 可以在有没有 Proxy 之间做一个对比
        3
    ljbha007   336 天前
    试了很多办法 都不行
        4
    gen900   336 天前
    @meepo3927 随机替换 Math。
        5
    murmur   336 天前
    @meepo3927 以前有在线编程题因为测试用例是给定的被摸出规律 然后返回值 return true 或者 return false 都能过很多例子
        6
    chairuosen   336 天前
    抖个机灵:
    ```
    else{
    return false
    }
    return true
    ```
        7
    page470075640   336 天前
    ```
    if (Math.random() < 0.5) {
    console.log('hooked')

    self.Math = new Proxy(Math, {
    get(obj, prop) {
    return obj[prop]
    }
    })
    } else {
    return false
    }

    return true


    function self() {}
    ```
        8
    themostlazyman   336 天前
    self.Math.random = () => {
    return 1;
    }
        9
    autoxbc   336 天前   ♥ 2
    function bomb()
    {
    try {
    return bomb()
    } catch(err) {
    try {
    Math.PI
    return false
    } catch(err) {
    return true
    }
    }
    }

    console.log( bomb() )
        10
    TomatoYuyuko   336 天前
    @autoxbc #9 666 这是什么蛇皮操作?为啥爆栈之后 err 打印不出来了,而且为啥有代理π会报错,看不懂 QAQ
        11
    autoxbc   336 天前   ♥ 2
    @TomatoYuyuko #10
    Math 真身和代理的区别是代理多一次 getter 函数调用

    所以先填满栈,再去访问 Math.PI ,失败说明被代理,成功说明是静态对象

    思路来自楼主的上一贴
    https://www.v2ex.com/t/509253
        12
    mytry   336 天前
    @autoxbc 回答正确~ 其实最先是在研究这个问题,然后才虚构了上一贴的问题😄 不过这个问题还有更简单更高效更通用的答案。
        13
    eggggger   336 天前   ♥ 1
    function hasProxy(obj) {
    Object.defineProperty(obj, 'self', {
    get: function() { return this }
    })
    return obj.self !== obj
    }
        14
    mytry   336 天前
    @eggggger 💯
        15
    yuutan   335 天前
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2585 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 14:14 · PVG 22:14 · LAX 07:14 · JFK 10:14
    ♥ Do have faith in what you're doing.