视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Chrome中JSON.parse的特殊实现_json
2020-11-27 20:56:47 责编:小采
文档

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中已经修复.

下载本文
显示全文
专题