检测 Math 对象是否被 Proxy 拦截。(如果有打印 hooked,期望得到 true ;没有则 false )
在线代码: https://jsfiddle.net/8sdugz9r/
答案有多个,当然越简单越好~
![]() | 1 meepo3927 2018-11-20 16:09:32 +08:00 if (Math.random() < 0.5) 是何作用 ? |
![]() | 3 ljbha007 2018-11-20 16:29:57 +08:00 试了很多办法 都不行 |
![]() | 5 murmur 2018-11-20 16:39:06 +08:00 @meepo3927 以前有在线编程题因为测试用例是给定的被摸出规律 然后返回值 return true 或者 return false 都能过很多例子 |
![]() | 6 chairuosen 2018-11-20 16:47:43 +08:00 抖个机灵: ``` else{ return false } return true ``` |
![]() | 7 page470075640 2018-11-20 17:35:09 +08:00 ``` 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 2018-11-20 17:52:47 +08:00 self.Math.random = () => { return 1; } |
![]() | 9 autoxbc 2018-11-20 18:48:53 +08:00 ![]() function bomb() { try { return bomb() } catch(err) { try { Math.PI return false } catch(err) { return true } } } console.log( bomb() ) |
10 TomatoYuyuko 2018-11-20 19:03:00 +08:00 @autoxbc #9 666 这是什么蛇皮操作?为啥爆栈之后 err 打印不出来了,而且为啥有代理π会报错,看不懂 QAQ |
![]() | 11 autoxbc 2018-11-20 19:13:27 +08:00 ![]() @TomatoYuyuko #10 Math 真身和代理的区别是代理多一次 getter 函数调用 所以先填满栈,再去访问 Math.PI ,失败说明被代理,成功说明是静态对象 思路来自楼主的上一贴 t/509253 |
![]() | 12 mytry OP @autoxbc 回答正确~ 其实最先是在研究这个问题,然后才虚构了上一贴的问题 不过这个问题还有更简单更高效更通用的答案。 |
13 eggggger 2018-11-20 20:23:49 +08:00 ![]() function hasProxy(obj) { Object.defineProperty(obj, 'self', { get: function() { return this } }) retrn obj.self !== obj } |