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里取容器大小、定位、距离等属性搜集整理
Aug 19 Javascript
jQuery插件expander实现图片翻转特效
May 21 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
Webpack 实现 AngularJS 的延迟加载
Mar 02 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
Nov 17 Javascript
BootStrap中
Dec 10 Javascript
JavaScript使用Ajax上传文件的示例代码
Aug 10 Javascript
jQuery图片加载失败替换默认图片方法汇总
Nov 29 jQuery
vuex的使用及持久化state的方式详解
Jan 23 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
Apr 23 Javascript
Angular项目如何升级至Angular6步骤全纪录
Sep 03 Javascript
详解JavaScript 的执行机制
Sep 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调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
初识ThinkPHP控制器
2016/04/07 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
Vue 去除路径中的#号
2018/04/19 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Python多线程爬虫简单示例
2016/03/04 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
解决python 输出是省略号的问题
2018/04/19 Python
flask入门之表单的实现
2018/07/18 Python
python重要函数eval多种用法解析
2020/01/14 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
毕业生教师求职信
2013/10/20 职场文书
运动会跳远加油稿
2014/02/20 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
户外活动总结
2015/02/04 职场文书
单位政审意见范文
2015/06/04 职场文书
网络研修随笔感言
2015/11/18 职场文书
化工生产实习心得体会
2016/01/22 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
七年级作文之秋游
2019/10/21 职场文书
Vue.Draggable实现交换位置
2022/04/07 Vue.js