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中的常见排序算法
Mar 27 Javascript
Jquery动态改变图片IMG的src地址示例
Jun 25 Javascript
JQuery的$命名冲突详细解析
Dec 28 Javascript
jQuery ajax调用WCF服务实例
Jul 16 Javascript
js简单设置与使用cookie的方法
Jan 22 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 Javascript
JavaScript转换数据库DateTime字段类型方法
Jun 27 Javascript
原生js封装运动框架的示例讲解
Oct 01 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
Element-UI踩坑之Pagination组件的使用
Oct 29 Javascript
vue ssr+koa2构建服务端渲染的示例代码
Mar 23 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和ACCESS写聊天室(六)
2006/10/09 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
php实现评论回复删除功能
2017/05/23 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
js读取配置文件自写
2014/02/11 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
javascript中 try catch用法
2015/08/16 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
Python中类型关系和继承关系实例详解
2015/05/25 Python
Python 查看文件的读写权限方法
2018/01/23 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python列表切片常用操作实例解析
2020/03/10 Python
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
渔夫的故事教学反思
2014/02/14 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
环保建议书作文
2014/03/12 职场文书
部门2014年度工作总结
2014/11/12 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
分享python函数常见关键字
2022/04/26 Python