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 拾碎[三] 使用className属性
Oct 16 Javascript
validator验证控件使用代码
Nov 23 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
Apr 15 Javascript
js实现表格字段排序
Feb 19 Javascript
基于JavaScript实现图片剪切效果
Mar 07 Javascript
JavaScript输入框字数实时统计更新
Jun 17 Javascript
20行js代码实现的贪吃蛇小游戏
Jun 20 Javascript
mpvue中使用flyjs全局拦截的实现代码
Sep 13 Javascript
ES6 Proxy实现Vue的变化检测问题
Jun 11 Javascript
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
JavaScript内置对象之Array的使用小结
May 12 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
图解上海144收音机
2021/03/02 无线电
php mssql 时间格式问题
2009/01/13 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
ExtJS 入门
2010/10/29 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
利用原生JS实现data方法示例代码
2019/05/28 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
Python中类型检查的详细介绍
2017/02/13 Python
详解python中的线程
2018/02/10 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
python实现字符串和字典的转换
2018/09/29 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
高级护理专业毕业生推荐信
2013/12/25 职场文书
小学班主任事迹材料
2014/12/17 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
Python socket如何解析HTTP请求内容
2022/02/12 Python