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 1.3.2 IE8中的一点点的小问题解决方法
Jul 10 Javascript
浅谈JavaScript中Date(日期对象),Math对象
Feb 05 Javascript
JS实现跟随鼠标的链接文字提示框效果
Aug 06 Javascript
JavaScript中关联原型链属性特性
Feb 13 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
使用three.js 画渐变的直线
Jun 05 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
Mar 09 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
详解基于Koa2开发微信二维码扫码支付相关流程
May 16 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
微信小程序class封装http代码实例
Aug 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
Yii框架登录流程分析
2014/12/03 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
CI框架附属类用法分析
2018/12/26 PHP
window.open的功能全解析
2006/10/10 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Django中Middleware中的函数详解
2019/07/18 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
python 的topk算法实例
2020/04/02 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
自荐书格式
2013/12/01 职场文书
临床医师个人自我评价
2014/04/06 职场文书
借款协议书
2014/04/12 职场文书
三万活动总结
2014/04/28 职场文书
我爱我家教学反思
2014/05/01 职场文书
移交协议书
2014/08/19 职场文书
节能环保演讲稿
2014/08/28 职场文书
公民代理授权委托书
2014/09/24 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python