Json字符串转换为JS对象的高效方法实例


Posted in Javascript onMay 01, 2013

今天学习JQuery源码看到一下方法,原来还可以这样解析JSON字符串:

  parseJSON: function( data ) {
  if ( typeof data !== "string" || !data ) {
   return null;
  }
  // Make sure leading/trailing whitespace is removed (IE can't handle it)
  data = jQuery.trim( data );
  // Make sure the incoming data is actual JSON
  // Logic borrowed from http://json.org/json2.js
  if ( /^[/],:{}/s]*$/.test(data.replace(///(?:["////bfnrt]|u[0-9a-fA-F]{4})/g, "@")
   .replace(/"[^"///n/r]*"|true|false|null|-?/d+(?:/./d*)?(?:[eE][+/-]?/d+)?/g, "]")
   .replace(/(?:^|:|,)(?:/s*/[)+/g, "")) ) {
   // Try to use the native JSON parser first
   return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();
  } else {
   jQuery.error( "Invalid JSON: " + data );
  }
 }

这个方法核心的代码就是:
(new Function("return " + data))();

它使用了Function()构造函数。讲json字符串作为函数执行数据传入,定义后立即执行该函数,此时这个函数会返回JSON对象

我做了一个测试,用这个方法解析JSON字符串的效率要比用Eval解析快好几百倍

var jsonStr ="{";
for(var i=0;i<10000;i++){
 jsonStr+="a"+i+":"+i+","
}
jsonStr = jsonStr.substring(0,jsonStr.length-1);
jsonStr+="}";
var date = new Date();
var start = date.getTime()
//var boj = (new Function("return "+jsonStr ))();
var boj = eval("("+jsonStr+")");
var date1 = new Date();
console.info(date1.getTime()-start);

我用firfox测试结果,用eval解析花费了7234毫秒,而用函数这种方法,用了55毫秒,太神奇了.
Javascript 相关文章推荐
document.createElement()用法
Mar 13 Javascript
js输出阴历、阳历、年份、月份、周示例代码
Jan 29 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
超漂亮的jQuery图片轮播特效
Nov 24 Javascript
原生JavaScript实现AJAX、JSONP
Feb 07 Javascript
javascript中this用法实例详解
Apr 06 Javascript
利用types增强vscode中js代码提示功能详解
Jul 07 Javascript
深入浅析Node.js单线程模型
Jul 10 Javascript
Vue侦测相关api的实现方法
May 22 Javascript
微信小程序 确认框的实现(附代码)
Jul 23 Javascript
如何基于JS截获动态代码
Dec 25 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
Jul 24 Javascript
Jquery post传递数组方法实现思路及代码
Apr 28 #Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 #Javascript
JQuery中如何传递参数如click(),change()等具体实现
Apr 28 #Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 #Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
Apr 28 #Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 #Javascript
js自动下载文件到本地的实现代码
Apr 28 #Javascript
You might like
无限级别菜单的实现
2006/10/09 PHP
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP内核探索:变量概述
2014/01/30 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
python连接字符串的方法小结
2015/07/13 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
法人身份证明书
2015/06/18 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers