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中用于处理正切的Math.tan()方法
Jun 15 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
基于javascript实现图片切换效果
Apr 17 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
Feb 28 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
Nov 01 Javascript
微信小程序实现简单跑马灯效果
May 26 Javascript
ES6 新增的创建数组的方法(小结)
Aug 01 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
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
德生PL550的电路分析
2021/03/02 无线电
php中随机显示图片的函数代码
2011/06/23 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python中turtle库的使用实例
2019/09/09 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
利用python实现AR教程
2019/11/20 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
python 异步async库的使用说明
2020/05/04 Python
python 基于wx实现音乐播放
2020/11/24 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
红领巾广播站广播稿
2014/02/01 职场文书
老同学聚会感言
2014/02/23 职场文书
《赶海》教学反思
2014/04/20 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
个人先进材料范文
2014/12/30 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
新员工试用期自我评价
2015/03/10 职场文书
二审答辩状范文
2015/05/22 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
Go 语言结构实例分析
2021/07/04 Golang