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 相关文章推荐
jQuery前台数据获取实现代码
Mar 16 Javascript
js 利用image对象实现图片的预加载提高访问速度
Mar 29 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
JS获取几种URL地址的方法小结
Feb 26 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
JS验证邮件地址格式方法小结
Dec 01 Javascript
小程序实现单选多选功能
Nov 04 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
vuex实现像调用模板方法一样调用Mutations方法
Nov 06 Javascript
Node.js Domain 模块实例详解
Mar 18 Javascript
JavaScript代码实现简单计算器
Dec 27 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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输出时间格式
2013/08/31 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
用ADODB.Stream转换
2007/01/22 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
2017/02/22 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
vue登录注册实例详解
2019/09/14 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
Django中多种重定向方法使用详解
2019/07/17 Python
NumPy排序的实现
2020/01/21 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
python中实现栈的三种方法
2020/12/19 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
一年级评语大全
2014/04/23 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
公司规章制度范本
2015/08/03 职场文书
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers