我在大约5年前在这个项目中使用了一个AJAX库,并且它在使用JSON解析日期时遇到了一些问题。我最后重写其解析函数以使用单个正则表达式:
return eval('(' + (enableDateParsing ? text.replace(/"(?:\\)?\/Date\((.*?)\)(?:\\)?\/"/g, "new Date($1)") : text) + ')');
这非常有效,但我认为如果我在IE8 / chrome / ff中使用原生JSON解析,我可以加快速度,所以我添加了这一点:
if (typeof JSON !== 'undefined' && typeof JSON.parse !== 'undefined') {
var nativeJsonDateParseRegex = /\/Date\(.*?\)\//g;
return JSON.parse(text, function (key, value) {
if (AjaxPro.enableDateParsing && typeof value === 'string' && value.match(nativeJsonDateParseRegex))
{
value = new Date(parseInt(value.substr(6)));
}
return value;
});
}
else // revert to eval for ie6/ie7
对于返回的每个JSON属性,reviver回调将执行一次,因此它必须非常快。在一个配置文件中,我看到它被称为170484次,但仍然运行得非常快(131.237ms)。关于如何加快速度的任何想法,或者这是没有认真调整的最佳方法吗?
答案 0 :(得分:1)
一个不太好的微优化,但仍然值得一试。 由于您的子字符串仅包含毫秒时间戳,因此没有其他垃圾字符串。 您可以删除对parseInt的调用。 您可以尝试使用简单的数学运算进行类型转换,例如乘以1 。 如果你过于热衷于微观优化,可能会节省一些时间。
value = new Date(1*(value.substr(6)));
示例:
a = "a:3333";
b = a.substring(2);
alert(b*2); // alerts 6666
答案 1 :(得分:1)
您的代码包含许多常量条件,您可以检查是否支持原生JSON。
建议:
)/
。AjaxPro.jsonParse
删除,并使其成为检查本机JSON的条件没有RE的代码:
if (typeof JSON !== 'undefined' && typeof JSON.parse !== 'undefined') {
AjaxPro.nativeJsonDateParseRegex = /\/Date\(.*?\)\//g;
AjaxPro.dateFunc = function(key, value) {
if (typeof value === "string" && !value.indexOf("/Date(")) {
return new Date(value.substring(6, value.length-2));
}
return value;
};
AjaxPro.jsonParse = function(text) {
if (AjaxPro.enableDateParsing) {
return JSON.parse(text, AjaxPro.dateFunc);
}
return JSON.parse(text);
};
} else // revert to eval for ie6/ie7
这应该高度优化。您可能希望在多个浏览器中自行运行更多测试。也许检查一个字符串的属性比检查它的类型(怀疑它)更快,就像那样。