Chrome中JSON.parse的特殊实现


Posted in Javascript onJanuary 12, 2011

IE8/Firefox3.5+/Chrome4/Safari4/Opera10 已实现该方法。使用方式很简单:

var str = '{"name":"jack"}'; 
var json = JSON.parse(str); 
alert(json.name);

在以上实现该方法的浏览器中都会弹出“jack”。
如果给Object.prototype添加一个解析json的方法(某人可能会强烈反对这么干污染了原生对象,这里纯粹为了讨论)
Object.prototype.parseJSON = function () { 
return JSON.parse(this); 
}

因为所有的对象都继承了Object的方法,这时候可以直接这么用了,
var str = '{"name":"jack"}'; 
var json = str.parseJSON(); 
alert(json.name);

str.parseJSON()时,parseJSON内部的this就指向了str。这时候并非所有浏览器都能解析成功。

IE8/Firefox/Safari/Opera仍然会弹出“jack”,Chrome中则报错了:Uncaught illegal access。
为什么这样写Chrome就不支持呢?比较两种方式,传给JSON.parse的参数一个是字符串str,一个是this。貌似这两个没区别?
当str.parseJSON()时,parseJSON内部的this指向了应该就是str。修改下parseJSON方法:

Object.prototype.parseJSON = function () { 
alert(typeof this); 
return JSON.parse(this); 
};

重新执行,可以发现parseJSON弹出的是object,可能这就是区别了。直接new一个字符串就能看到明显的效果了
var js = JSON.parse(new String('{"name":"jack"}')); 
alert(js.name);

以上代码除Chrome报错外,其它浏览器均执行正常。
基本得出结论:
Chrome中,JSON.parse的第一个参数只能是字符串,不能是对象(包括new String方式也不支持)
再回到上面给Object.prototype添加一个解析json的方法,如果要兼容所有浏览器,可以这么写:
Object.prototype.parseJSON = function () { 
return JSON.parse(this.toString()); 
} 
var str = '{"name":"jack"}'; 
var json = str.parseJSON(); 
alert(json.name);

2010-10-09 : 该BUG在Chrome6中已经修复.
Javascript 相关文章推荐
超级简单的图片防盗(HTML),好用
Apr 08 Javascript
统计jQuery中各字符串出现次数的工具
May 03 Javascript
jquery列表拖动排列(由项目提取相当好用)
Jun 17 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
Sep 18 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
Jan 04 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
AngularJS模态框模板ngDialog的使用详解
May 11 Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
浅谈小程序globalData的那些事儿
Nov 01 Javascript
vue中使用GraphQL的实例代码
Nov 04 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
Mar 07 Javascript
vue实现前端列表多条件筛选
Oct 26 Javascript
js中将字符串转换成json的三种方式
Jan 12 #Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 #Javascript
基于JQuery实现相同内容合并单元格的代码
Jan 12 #Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 #Javascript
Script的加载方法小结
Jan 12 #Javascript
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 #Javascript
javascript smipleChart 简单图标类
Jan 12 #Javascript
You might like
php生成文件
2007/01/15 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
JavaScript简单拖拽效果(1)
2017/05/17 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
Python中logging模块的用法实例
2014/09/29 Python
Python3 模块、包调用&路径详解
2017/10/25 Python
多个应用共存的Django配置方法
2018/05/30 Python
Python 获取div标签中的文字实例
2018/12/20 Python
对python 自定义协议的方法详解
2019/02/13 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
python机器学习实现决策树
2019/11/11 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
班组长的岗位职责
2013/12/09 职场文书
客服主管岗位职责
2013/12/13 职场文书
运动会广播稿300字
2014/01/10 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
征求意见函
2015/06/05 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL