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 相关文章推荐
javascript或asp实现的判断身份证号码是否正确两种验证方法
Nov 26 Javascript
jQuery点击弹出下拉菜单的小例子
Aug 01 Javascript
javascript的内存管理详解
Aug 07 Javascript
javascript中数组的多种定义方法和常用函数简介
May 09 Javascript
AngularJS控制器详解及示例代码
Aug 16 Javascript
详解vue.js的devtools安装
May 26 Javascript
详解webpack进阶之插件篇
Jul 06 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
Oct 17 Javascript
关于ES6箭头函数中的this问题
Feb 27 Javascript
JavaScript的Object.defineProperty详解
Jul 09 Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 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中的正则表达式
2014/08/17 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP7匿名类用法分析
2016/09/26 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
javascript,jquery闭包概念分析
2010/06/19 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
js简单的分页器插件代码实例
2019/09/11 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
linux面试题参考答案(11)
2016/11/26 面试题
体育教师自我鉴定
2014/02/12 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
义诊活动总结
2015/02/04 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书