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 相关文章推荐
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 Javascript
javascript 传统事件模型构造的事件监听器实现代码
May 31 Javascript
Javascript跨域请求的4种解决方式
Mar 17 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
May 08 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
JavaScript探测CSS动画是否已经完成的方法
Aug 30 Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
ES6数组的扩展详解
Apr 25 Javascript
JS实现简单tab选项卡切换
Oct 25 Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php去除数组中重复数据
2014/11/18 PHP
google地图的路线实现代码
2009/08/20 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
webpack external模块的具体使用
2018/03/10 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python global全局变量函数详解
2018/09/18 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
运动会广播稿500字
2014/01/28 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
nginx lua 操作 mysql
2022/05/15 Servers