检测 Math 对象是否被 Proxy 拦截。(如果有打印 hooked,期望得到 true ;没有则 false )
在线代码: https://jsfiddle.net/8sdugz9r/
答案有多个,当然越简单越好~

1
meepo3927 2018 年 11 月 20 日
if (Math.random() < 0.5)
是何作用 ? |
3
ljbha007 2018 年 11 月 20 日
试了很多办法 都不行
|
5
murmur 2018 年 11 月 20 日
@meepo3927 以前有在线编程题因为测试用例是给定的被摸出规律 然后返回值 return true 或者 return false 都能过很多例子
|
6
chairuosen 2018 年 11 月 20 日
抖个机灵:
``` else{ return false } return true ``` |
7
page470075640 2018 年 11 月 20 日
```
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 日
self.Math.random = () => {
return 1; } |
9
autoxbc 2018 年 11 月 20 日 function bomb()
{ try { return bomb() } catch(err) { try { Math.PI return false } catch(err) { return true } } } console.log( bomb() ) |
10
TomatoYuyuko 2018 年 11 月 20 日
@autoxbc #9 666 这是什么蛇皮操作?为啥爆栈之后 err 打印不出来了,而且为啥有代理π会报错,看不懂 QAQ
|
11
autoxbc 2018 年 11 月 20 日 @TomatoYuyuko #10
Math 真身和代理的区别是代理多一次 getter 函数调用 所以先填满栈,再去访问 Math.PI ,失败说明被代理,成功说明是静态对象 思路来自楼主的上一贴 https://www.v2ex.com/t/509253 |
13
eggggger 2018 年 11 月 20 日 function hasProxy(obj) {
Object.defineProperty(obj, 'self', { get: function() { return this } }) return obj.self !== obj } |