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 相关文章推荐
html5+javascript实现简单上传的注意细节
Apr 18 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
很棒的一组js图片轮播特效
Jan 12 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
以v-model与promise两种方式实现vue弹窗组件
May 21 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
Apr 11 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 Javascript
vue点击标签切换选中及互相排斥操作
Jul 17 Javascript
js实现验证码干扰(动态)
Feb 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 函数语法介绍一
2009/06/14 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
广告显示判断
2006/08/31 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
判断JS对象是否拥有某属性的方法推荐
2016/05/12 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python守护进程用法实例分析
2015/06/04 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
函授本科毕业自我鉴定
2013/10/09 职场文书
高级技校毕业生自荐信
2013/11/18 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
在js中修改html body的样式
2021/11/11 Javascript