當然,作者算了留了一個小小的練習給我們,因為他只用了兩個字元,導致轉換後的資料是未經處理資料的 8倍。他給我們提供了4個零寬字元,我們就可以縮小至4倍。 好了,我們來看下代碼吧。 文本(function(window) { var rep = { // 替換用的資料,使用了4個零寬字元,資料量減少了一半。 '00': '\u200b', '01': '\u200c', '10': '\u200d', '11': '\uFEFF' }; function hide(str) { str = str.replace(/[^\x00-\xff]/g, function(a) { // 轉碼 Latin-1 編碼以外的字元。 return escape(a).replace('%', '\\'); }); str = str.replace(/[\s\S]/g, function(a) { // 處理位元據並且進行資料替換 a = a.charCodeAt().toString(2); a = a.length < 8 ? Array(9 - a.length).join('0') + a : a; return a.replace(/../g, function(a) { return rep[a]; }); }); return str; } var tpl = '("@code".replace(/.{4}/g,function(a){var rep={"\u200b":"00","\u200c":"01","\u200d":"10","\uFEFF":"11"};return String.fromCharCode(parseInt(a.replace(/./g, function(a) {return rep[a]}),2))}))'; window.hider = function(code, type) { var str = hide(code); // 產生零寬字元串 str = tpl.replace('@code', str); // 產生模版 if (type === 'eval') { str = 'eval' + str; } else { str = 'Function' + str + '()'; } return str; }})(window);來測試下效果。(點代碼框右上方運行即可) 文本運行var code = hider('alert("測試一下。。")');console.log(code);再來試試產生後的資料。(如果上一步沒執行,直接執行這裡會報錯。) 文本運行eval(code);