邪修 JavaScript ,10 段“千萬別上生產(chǎn)”的黑魔法代碼
——僅供技術(shù)獵奇,切勿真用!
?? 每條都可能:性能爆雷、內(nèi)存泄漏、調(diào)試器崩潰、老板原地升天
面試炫技 OK,項目敢用就等死!
1?? 一行無限循環(huán)彈窗
while(1) alert('邪修JS');
瀏覽器直接卡死,用戶只能強制關(guān)機。
2?? 原型鏈污染全局
Object.prototype.toString = () => '??';
console.log(({}).toString()); // ??
所有對象行為被篡改,調(diào)試器原地崩潰。
3?? 隱式強制類型地獄
[] + {}; // "[object Object]"
{} + []; // 0
不同位置結(jié)果不同,全靠解析器心情。
4?? with
作用域黑洞
with({a:1}){ var a = 2; console.log(a); } // 2
作用域鏈動態(tài)查找,IDE 無法靜態(tài)分析。
5?? 動態(tài)函數(shù)名
const evil = new Function('a', 'b', 'return a + b');
console.log(evil(1, 2)); // 3
運行時編譯代碼,靜態(tài)掃描工具全部失明。
6?? 隱式全局變量泄漏
function leak() { undeclared = 'leaked'; }
leak();
console.log(undeclared); // leaked
變量泄漏到全局,調(diào)試器找不到定義。
7?? 循環(huán)引用內(nèi)存泄漏
const a = {};
const b = {};
a.b = b;
b.a = a;
互相引用導致無法垃圾回收,內(nèi)存爆炸。
8?? eval
遠程代碼執(zhí)行
eval(prompt('輸入代碼'));
直接把瀏覽器變成遠程 Shell。
9?? 事件監(jiān)聽器無限疊加
document.addEventListener('click', () => console.log('click'));
document.addEventListener('click', () => console.log('click'));
// 重復添加,內(nèi)存爆炸
監(jiān)聽器無限疊加,性能直線下降。
?? 隱式類型轉(zhuǎn)換陷阱
console.log(!![]); // true
console.log(!!{}); // true
console.log(!!''); // false
隱式類型轉(zhuǎn)換導致邏輯混亂,調(diào)試器無法追蹤。
邪修口訣
“作用域鏈當迷宮,原型鏈當滑梯;
隱式轉(zhuǎn)換當魔法,內(nèi)存泄漏當煙花?!?/p>
PS
想要正經(jīng)的學習 JS ,從編程獅的《JavaScript 入門課程》開始!