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 相关文章推荐
javascript add event remove event
Apr 07 Javascript
利用JS重写Cognos右键菜单的实现代码
Apr 11 Javascript
js 中{},[]中括号,大括号使用详解
May 12 Javascript
jQuery中each()方法用法实例
Dec 27 Javascript
jQuery+HTML5实现图片上传前预览效果
Aug 20 Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
AngularJS入门教程之路由与多视图详解
Aug 19 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
Sep 19 Javascript
JS合并两个数组的3种方法详解
Oct 24 Javascript
原生JavaScript之es6中Class的用法分析
Feb 23 Javascript
微信小程序学习之自定义滚动弹窗
Dec 20 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
PHP 数组入门教程小结
2009/05/20 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
php实现异步数据调用的方法
2015/12/24 PHP
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
jQuery知识点整理
2015/01/30 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
基于Python实现扑克牌面试题
2019/12/11 Python
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
设计师求职信模板
2014/05/06 职场文书
施工质量承诺书范文
2014/05/30 职场文书
安全第一课观后感
2015/06/18 职场文书
公司人事管理制度
2015/08/05 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android