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 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
formValidator3.3的ajaxValidator一些异常分析
Jul 12 Javascript
Js实现无刷新删除内容
Apr 29 Javascript
jQuery移动web开发中的页面初始化与加载事件
Dec 03 Javascript
AngularJS中的Directive自定义一个表格
Jan 25 Javascript
JS简单实现String转Date的方法
Mar 02 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
React.js绑定this的5种方法(小结)
Jun 05 Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 Javascript
使用jQuery实现掷骰子游戏
Oct 24 jQuery
jQuery实现手风琴效果(蒙版)
Jan 11 jQuery
leaflet加载geojson叠加显示功能代码
Feb 21 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
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
python分割列表(list)的方法示例
2017/05/07 Python
Python MD5加密实例详解
2017/08/02 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
高校辅导员推荐信范文
2013/12/25 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
反邪教警示教育方案
2014/05/13 职场文书
经费申请报告
2015/05/15 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
乔迁新居祝福语
2019/11/04 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
redis实现排行榜功能
2021/05/24 Redis
Python实现智慧校园自动评教全新版
2021/06/18 Python
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
拙作再改《我的收音机情缘》
2022/04/05 无线电