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操作FRAME中的IFRAME及其内容的实现代码
Jul 26 Javascript
控制文字内容的显示与隐藏示例
Jun 11 Javascript
Windows 系统下安装和部署Egret的开发环境
Jul 31 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
jQuery中:nth-child选择器用法实例
Dec 31 Javascript
js判断上传文件后缀名是否合法
Jan 28 Javascript
url中的特殊符号有什么含义(推荐)
Jun 17 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
Vue.js数据绑定之data属性
Jul 07 Javascript
layui 表格的属性的显示转换方法
Aug 14 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 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/06/25 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
python 实现按对象传值
2019/12/26 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
汽车销售求职自荐信
2013/10/01 职场文书
实习生自荐信范文
2013/11/13 职场文书
现金会计岗位职责
2013/12/05 职场文书
男方父母证婚词
2014/01/12 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
Nginx 常用配置
2022/05/15 Servers