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 相关文章推荐
javascript web页面刷新的方法收集
Jul 02 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
Javascript中找到子元素在父元素内相对位置的代码
Jul 21 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
Dec 13 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
Vue-路由导航菜单栏的高亮设置方法
Mar 17 Javascript
jQuery仿移动端支付宝键盘的实现代码
Aug 15 jQuery
Vue侦测相关api的实现方法
May 22 Javascript
微信小程序实现签字功能
Dec 23 Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
Python实现子类调用父类的方法
2014/11/10 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
出纳岗位职责
2013/11/09 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
感恩之星事迹材料
2014/05/03 职场文书
2014年体育工作总结
2014/11/24 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
何玥事迹观后感
2015/06/16 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
讲解MySQL增删改操作
2022/05/06 MySQL