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 相关文章推荐
常用参考资料(手册)下载或者链接
Jul 22 Javascript
javascript面向对象之二 命名空间
Feb 08 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
jQuery实现平滑滚动到指定锚点的方法
Mar 20 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
Mar 23 Javascript
js实现简单的计算器功能
Jan 16 Javascript
javascript+css3开发打气球小游戏完整代码
Nov 28 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
js中实例与对象的区别讲解
Jan 21 Javascript
JavaScript实现多文件下载方法解析
Aug 07 Javascript
如何HttpServletRequest文件对象并储存
Aug 14 Javascript
解决element-ui的下拉框有值却无法选中的情况
Nov 07 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
检测png图片是否完整的php代码
2010/09/06 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
ES6中Set和Map用法实例详解
2020/03/02 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
设计模式的基本要素是什么
2014/04/21 面试题
高中的自我鉴定
2013/12/16 职场文书
《大海那边》教学反思
2014/04/09 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
九华山导游词
2015/02/03 职场文书
react 路由Link配置详解
2021/11/11 Javascript
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js