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 相关文章推荐
showModalDialog 和 showModelessDialog
Jan 22 Javascript
超简单的jquery的AJAX用法
May 10 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
Bootstrap按钮组件详解
Apr 26 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
jquery.masonry瀑布流效果
May 25 jQuery
jQuery实现切换隐藏与显示同时切换图标功能
Oct 29 jQuery
vue使用localStorage保存登录信息 适用于移动端、PC端
May 27 Javascript
js实现移动端tab切换时下划线滑动效果
Sep 08 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 adodb分页实现代码
2009/03/19 PHP
php中socket通信机制实例详解
2015/01/03 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
一段实时更新的时间代码
2006/07/07 Javascript
js中运算符&& 和 || 的使用记录
2014/08/21 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
Python群发邮件实例代码
2014/01/03 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
代码详解django中数据库设置
2019/01/28 Python
详解python做UI界面的方法
2019/02/27 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
django中的数据库迁移的实现
2020/03/16 Python
python如何爬取网页中的文字
2020/07/28 Python
Python如何读写CSV文件
2020/08/13 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
应届毕业生个人自荐信范文
2013/11/30 职场文书
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2015年销售人员工作总结
2015/04/07 职场文书