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 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
拖动Html元素集合 Drag and Drop any item
Dec 22 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
JavaScript移除数组内重复元素的方法
Mar 18 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
Nov 10 Javascript
Vue filter介绍及其使用详解
Oct 21 Javascript
Node.js搭建小程序后台服务
Jan 03 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
Angular如何在应用初始化时运行代码详解
Jun 11 Javascript
简单的React SSR服务器渲染实现
Dec 11 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 xml实例 留言本
2009/03/20 PHP
php下Memcached入门实例解析
2015/01/05 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
python+mysql实现教务管理系统
2019/02/20 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
市场开发与营销专业求职信
2013/12/31 职场文书
白酒市场开发计划书
2014/01/09 职场文书
一岗双责责任书
2014/04/15 职场文书
教师个人自我评价
2015/03/04 职场文书
公司门卫岗位职责
2015/04/13 职场文书
倡议书范文大全
2015/04/28 职场文书
六年级作文之关于梦
2019/10/22 职场文书
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript