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 注册事件代码
Jan 27 Javascript
Jquery动态添加及删除页面节点元素示例代码
Jun 16 Javascript
详细解读JavaScript编程中的Promise使用
Jul 27 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
Feb 16 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
微信小程序开发之map地图实现教程
Jun 08 Javascript
2种简单的js倒计时方式
Oct 20 Javascript
Vue2.5通过json文件读取数据的方法
Feb 27 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
element 动态合并表格的步骤
Dec 31 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下几种删除目录的方法总结
2007/08/19 PHP
php adodb连接不同数据库
2009/03/19 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Django中信号signals的简单使用方法
2019/07/04 Python
简单分析python的类变量、实例变量
2019/08/23 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
python适合做数据挖掘吗
2020/06/16 Python
python集合的新增元素方法整理
2020/12/07 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
电子商务应届生自我鉴定
2014/01/13 职场文书
高二历史教学反思
2014/01/25 职场文书
军神教学反思
2014/02/04 职场文书
求职毕业生自荐书
2014/02/08 职场文书
英雄儿女观后感
2015/06/09 职场文书
python执行js代码的方法
2021/05/13 Python
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
django 认证类配置实现
2021/11/11 Python