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 相关文章推荐
Extjs 点击复选框在表格中增加相关信息行
Jul 12 Javascript
JavaScript 对象详细整理总结
Sep 29 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
详解jQuery中的事件
Dec 14 Javascript
js实现1,2,3,5数字按照概率生成
Sep 12 Javascript
Vue渲染函数详解
Sep 15 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
Sep 28 Javascript
vue内置指令详解
Apr 03 Javascript
细说webpack6 Babel的使用详解
Sep 26 Javascript
JavaScript setTimeout()基本用法有哪些
Nov 04 Javascript
编写v-for循环的技巧汇总
Dec 01 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
基于PHPExcel的常用方法总结
2013/06/13 PHP
php实现图片缩放功能类
2013/12/18 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
php中socket的用法详解
2014/10/24 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
标准PHP的AES加密算法类
2015/03/12 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
详解Python文件修改的两种方式
2019/08/22 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
查环查孕证明
2014/01/10 职场文书
大家访活动实施方案
2014/03/10 职场文书
供应链金融服务方案
2014/05/25 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技