js 奇葩技巧之隱藏代碼
昨天在群看到有人發(fā)了個(gè)文章叫《“短”化你的代碼》,思路非常不錯(cuò),采用unicode的零寬字符來(lái)實(shí)現(xiàn)字符隱藏,雖然有字符,可是你卻看不見(jiàn)它。
這篇文章詳細(xì)的介紹了這種方法的實(shí)現(xiàn)原理,最后還給出了一個(gè)生成工具。
當(dāng)然,作者算了留了一個(gè)小小的練習(xí)給我們,因?yàn)樗挥昧藘蓚€(gè)字符,導(dǎo)致轉(zhuǎn)換后的數(shù)據(jù)是原始數(shù)據(jù)的 8倍。
他給我們提供了4個(gè)零寬字符,我們就可以縮小至4倍。
好了,我們來(lái)看下代碼吧。
(function(window) {
var rep = { // 替換用的數(shù)據(jù),使用了4個(gè)零寬字符,數(shù)據(jù)量減少了一半。
'00': '\u200b',
'01': '\u200c',
'10': '\u200d',
'11': '\uFEFF'
};
function hide(str) {
str = str.replace(/[^\x00-\xff]/g, function(a) { // 轉(zhuǎn)碼 Latin-1 編碼以外的字符。
return escape(a).replace('%', '\\');
});
str = str.replace(/[\s\S]/g, function(a) { // 處理二進(jìn)制數(shù)據(jù)并且進(jìn)行數(shù)據(jù)替換
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);
大家可以通過(guò)最簡(jiǎn)單的代碼例子進(jìn)行測(cè)試一下,看看效果如何,也可以進(jìn)一步優(yōu)化,或者寫成插件什么的,就當(dāng)練習(xí)吧。。
雖然這個(gè)東西沒(méi)什么實(shí)際用處,不過(guò)有時(shí)候玩玩還是不錯(cuò)的,可出面試題嚇唬新人哦。。
以上就是小編為大家整理的js 奇葩技巧之隱藏代碼,希望對(duì)大家有所幫助!
相關(guān)文章
JS實(shí)現(xiàn)簡(jiǎn)單的右下角彈出提示窗口完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)簡(jiǎn)單的右下角彈出提示窗口的方法,可實(shí)現(xiàn)點(diǎn)擊連接右下角彈出提示框的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
JavaScript中的object轉(zhuǎn)換函數(shù)toString()與valueOf()介紹
這篇文章主要介紹了JavaScript中的object轉(zhuǎn)換函數(shù)toString()與valueOf()介紹,需要的朋友可以參考下2014-12-12
學(xué)習(xí)drag and drop js實(shí)現(xiàn)代碼經(jīng)典之作
今天讀John Resig的Pro Javascript Techniques時(shí)候看到他書(shū)上給的一個(gè)關(guān)于drag and drop的例子, 合上書(shū)本自己寫一個(gè)簡(jiǎn)化版本的。大約20分鐘完成, 沒(méi)有考慮兼容firefox。整個(gè)代碼封裝成一個(gè)對(duì)象 也是借鑒書(shū)中的風(fēng)格。我覺(jué)得很好。2009-04-04
JS 兩日期相減,獲得天數(shù)的小例子(兼容IE,FF)
這篇文章介紹了兩日期相減,獲得天數(shù)的小例子,有需要的朋友可以參考一下2013-07-07
數(shù)據(jù)排序誰(shuí)最快(javascript中的Array.prototype.sort PK 快速排序)
今天在51js論壇中看到一個(gè)網(wǎng)友發(fā)布了一個(gè)javasctipt實(shí)現(xiàn)的快速排序的算法,前些日子工作中也涉及到j(luò)avasctipt中數(shù)據(jù)排序的應(yīng)用,當(dāng)時(shí)為了提高排序速度,使用的也是快速排序的算法。2007-01-01
動(dòng)態(tài)加載dtree.js樹(shù)treeview(示例代碼)
本篇文章主要是對(duì)動(dòng)態(tài)加載dtree.js樹(shù)treeview的示例代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
JavaScript 事件屬性綁定帶參數(shù)的函數(shù)
在JavaScript中,為了實(shí)現(xiàn)表現(xiàn)和控制相分離,可以通過(guò)0級(jí)的DOM事件屬性或者2級(jí)的事件模型來(lái)實(shí)現(xiàn),不過(guò)這兩者在針對(duì)某個(gè)事件類型調(diào)用相應(yīng)的事件句柄的時(shí)候,不能給事件句柄提供參數(shù),也就是說(shuō),事件屬性的值只能是一個(gè)函數(shù)引用。2009-03-03

