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中的call实现继承
Jan 22 Javascript
jQuery 滑动方法slideDown向下滑动元素
Jan 16 Javascript
JavaScript简介
Feb 15 Javascript
JavaScript去除数组里重复值的方法
Jul 13 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
JS实现的自定义水平滚动字体插件完整实例
Jun 17 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
Oct 17 Javascript
jQuery length 和 size()区别总结
Apr 26 jQuery
Vue Element 分组+多选+可搜索Select选择器实现示例
Jul 23 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
Nov 12 Javascript
vue3不同环境下实现配置代理
May 25 Vue.js
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/06/16 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP写日志的实现方法
2014/11/05 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
Python遍历字典方式就实例详解
2019/12/28 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
大学生职业生涯规划方案
2014/01/03 职场文书
调查研究项目计划书
2014/04/29 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
租车协议书
2015/01/27 职场文书
单位委托函范文
2015/01/29 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL