低版本浏览器如何兼容JSON对象?(转载http://www.cnblogs.com/bigbrother1984/p/4338669.html)

// 具体实现想看:douglascrockford : https://github.com/douglascrockford/JSON-js

JSON.parse的思路:

1. eval(str)

2.(new Function('return ' + str))()

示例操作结果显示

var str = '{"name":"cnbloges"}'
method 1:eval(str)  // SyntaxError: Unexpected token :
method 2:(new Function('return'+str))() // {name: "cnblogs"}

为什么执行eval(str)就报错了呢?看下面

eval("("+str+")") //{name:"cnblogs"}

为什么会这样?


首先,先看看{}在javascript中纯在多少种用处

  • 对象: 用于创建对象 var obj = {...}

  • 代码块(code block): if () {...}

 

 下面就在develop tool测试下:

{name: 'cnblogs'}
// 'cnblogs' ? 什么,居然返回一个字符转,而不是一个对象,说明此处的"{}"是code block,前面的'name'是标记(label statement)

//而这种情况下呢:
var obj = {name: 'cnblogs'}
obj
//  返回: Object {name: "cnblogs"}, 说明此时"{}"被当成了对象来解析

那为什么会存在两种不同的解析方式?

  1. {}用于开头时: 会被当成code block来解析
  2. "="是复制运算符,左右边必须是表达式,具体详看ES5,这样右边会被当成表达式来进行解析,最终解析成对象

      到这里就柳暗花明了吧?eval(str)会将里面"{}"当成code block来解析,而str中存在":",且"name"带上了双引号,说明不是label,“name”、“cnblog”均会被当成statement来解析,那么中间的":"就会爆出"Unexpected token :",所以要解决该问题,只需要使js解析器将str里面的内容当成对象来eval就可以了。方法不仅仅上面提到的添加"()",还有其他方式,例如:借助于","

eval('0,' + str)

。。。。。。

最后人家博主还友情提示:

立志往前端方向发展的同学,把ES5规范好好读读吧,内容不多,但是会让你对js有深刻的理解,除了lexical execution较难理解外,其他章节下功夫还是可以吃透的。

posted @ 2015-05-06 10:53  一日三餐  阅读(168)  评论(0)    收藏  举报