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 相关文章推荐
js函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
js实现一个省市区三级联动选择框代码分享
Mar 06 Javascript
JS异常处理的一个想法(sofish)
Mar 14 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
Aug 26 Javascript
js对象继承之原型链继承实例
Jan 10 Javascript
FullCalendar日历插件应用之数据展现(一)
Dec 23 Javascript
jQuery动态生成Bootstrap表格
Nov 01 Javascript
js常用的继承--组合式继承
Mar 06 Javascript
JS 事件机制完整示例分析
Jan 15 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 Javascript
微信小程序实现分页加载效果
Nov 19 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函数的方法
2013/11/13 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
Python使用matplotlib 画矩形的三种方式分析
2019/10/31 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
教师自我评价范例
2013/09/24 职场文书
酒店led欢迎词
2014/01/09 职场文书
料理师求职信
2014/01/30 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
超市促销活动总结
2014/07/01 职场文书
出国导师推荐信
2015/03/25 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
centos7安装mysql5.7经验记录
2022/05/02 Servers