關于eval 與new Function 到底該選哪個?
廢話不多說,直接上測試代碼
var aa = "{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}";
var now = new Date().getTime();
for (var i = 0; i < 100000; i++) {
var a = eval("(" + aa + ")");
}
var now1 = new Date().getTime();
document.write("eval 時間為:" + (now1 - now) + "<br/>");
var now2 = new Date().getTime();
for (var i = 0; i < 100000; i++) {
var fn = new Function("return" + aa);
fn();
}
var now3 = new Date().getTime();
document.write("new Function時間為:" + (now3 - now2) + "<br/>");
//經(jīng)過測試結果 FF效果如下
//eval 時間為:979
//new Function時間為:1372
//經(jīng)過測試結果 IE8效果如下
//eval 時間為:913
//new Function時間為:1037
//經(jīng)過測試結果 Chrome效果如下
//eval 時間為:211
//new Function時間為:251
//經(jīng)過測試結果 Opera
//eval 時間為:384
//new Function時間為:1024
測試結果為不同瀏覽器測試的參考數(shù)據(jù),覺得奇怪的是為什么每個瀏覽器測試的時候都是eval要快點,我們是不是要采用他呢?
親,先不要急, 接下往下看,帶著這些疑問,好奇心的我終于展開了另外一個測試,這時候我做一個動態(tài)涵數(shù)來分別讓eval 和 new Function 來執(zhí)行再看看效果
var testEval = function (obj) {
<SPAN style="COLOR: #ff0000"> return eval('0, ' + obj + '');</SPAN>
//return eval('( ' + obj + ')');
};
var testFun = function (obj) {
var fn = new Function("return " + obj);
fn();
};
var now = new Date().getTime();
for (var i = 0; i < 1000; i++) {
var fn = testEval("function test(){ document.write('我有一頭小毛驢,從來也不騎.........'); }");
fn();
}
var now1 = new Date().getTime();
document.write("<br/>");
document.write("eval 時間為:" + (now1 - now) + "<br/>");
var now2 = new Date().getTime();
for (var i = 0; i < 1000; i++) {
testFun("document.write('我有一頭小毛驢,從來也不騎.........');");
}
var now3 = new Date().getTime();
document.write("new Function時間為:" + (now3 - now2) + "<br/>");
//經(jīng)過測試結果 FF效果如下
//eval 時間為:495
//new Function時間為:50
//經(jīng)過測試結果 IE8效果如下
//eval 時間為:34
//new Function時間為:20
//經(jīng)過測試結果 Chrome效果如下
//eval 時間為:7
//new Function時間為:4
//經(jīng)過測試結果 Opera
//eval 時間為:7
//new Function時間為:18
如上結果測試 如果構建一個動態(tài)執(zhí)行讓eval去執(zhí)行 在FF上是超級的慢, 其它瀏覽器差別不大, 我們這里不必過于太多追究
return eval('0, ' + obj + ''); 可能大家覺得這里這個 0 是什么意思,加0主要是兼容所有的瀏覽器,不加的話,IE9以下版本就會報錯
但是真正的0的意思 怎么去剖析 我還真不知道,只是知道加 了這個就可以解決惡心的IE不能兼容的問題
經(jīng)過上面二個栗子說明 如果是為了JSON串的轉(zhuǎn)換eval 明顯要快, 如果是動態(tài)涵數(shù)解析 那么 new Function要快, 這里說出了二個優(yōu)劣勢, 還有的就是eval兼容性不很好,如果解析出錯,可能會導致其它的JS腳本不會執(zhí)行,
而 后者則不會,他只會針對于 這個Function 我這人不喜歡太麻煩的事情, 果斷放棄eval 用 new Function 來代替。 如果有理解的不太對的地方,請大家指正,歡迎拍磚。
相關文章
簡單談談Javascript函數(shù)中的arguments
在JavaScript中,arguments對象是比較特別的一個對象,實際上是當前函數(shù)的一個內(nèi)置屬性。下面這篇文章主要介紹了關于Javascript函數(shù)中的arguments面貌以及如何轉(zhuǎn)化為數(shù)組的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02