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 相关文章推荐
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
ext 列表页面关于多行查询的办法
Mar 25 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
Sep 03 Javascript
js实现跨域访问的三种方法
Dec 09 Javascript
JavaScript  event对象整理及详细介绍
Oct 10 Javascript
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
浅谈开发eslint规则
Oct 01 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
js中async函数结合promise的小案例浅析
Apr 14 Javascript
前端插件之Bootstrap Dual Listbox使用教程
Jul 23 Javascript
javascript中layim之查找好友查找群组
Feb 06 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
基于php权限分配的实现代码
2013/04/28 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
Javascript 编码约定(编码规范)
2018/03/11 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
python实现中文分词FMM算法实例
2015/07/10 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
pandas 时间格式转换的实现
2019/07/06 Python
python实现邮件自动发送
2019/08/10 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
会计学自我鉴定
2014/02/06 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB