JavaScript的eval JSON object问题

 更新时间:2009年11月15日 23:09:46   作者:   我要评论
在做AJAX应用开发的时候,我们通常喜欢把服务器端返回的JSON格式字符串在客户端的回调函数中把它作为JavaScript代码执行并用一个变量保存起来,以方便使用返回的数据。
通常的做法就是var jsonData = eval(xmlHttp.responseText)。这看起来似乎一切都是正确的,但当你运行代码的时候,你会发现报“invalid labe”错误了。为什么?我也不清楚,但我找到了解决这个问题的方法。

在我刚遇到这个问题的时候也特别头痛,因为看起来所有编码是正确的,为了测试出现问题的位置,我逐渐缩小代码范围,最终得到如下简短代码:
复制代码 代码如下:

var jsonStr1 = '{"Name":"Tom","Sex":"Man"}';
var jsonObj1 = eval(jsonStr1);
alert(jsonObj1.Name);

以上代码执行正是报一开始说的invalid labe错误。难道eval函数对某些表达式或对象有限制?于是我又测试了数组对象,代码如下,结果下面代码运行很正常:
复制代码 代码如下:

var arrStr = '["Tom","Man"]';
var arrObj = eval(arrStr);
alert(arrObj[0]);

难道是我机子上的JavaScript解析器就JSON解析方面出了问题,于是我又测试下面代码,但结果一样正常:
复制代码 代码如下:

var jsonObj = {"Name":"Tom","Sex":"Man"};
alert(jsonObj.Name);

最终我还是没有自行把问题解决,于是根据相关错误信息上网搜索答案,没想到一下子就找到了问题的根源,解决办法就是“在eval的时候,要先把 JSON字符串值用 ‘()'括号先括起来”。网上找的资料都没有说明是什么原因,当然我也还是没有明白正真的原因的。括号是起强制先执行或先运算作用的,返回的JSON就一个完整的对象,中间也没有表达式,为什么还要加括号!像数组这种较复杂点的对象也能正常eval。没办法,就先记着这种用法吧。正确用法如下(注意看eval两端的括号):
复制代码 代码如下:

var jsonStr2 = '{"Name":"Tom","Sex":"Man"}';
var jsonObj2 = eval('(' + jsonStr2 + ')');
alert(jsonObj2.Name);

相关文章

  • js实现点击图片将图片地址复制到粘贴板的方法

    js实现点击图片将图片地址复制到粘贴板的方法

    这篇文章主要介绍了js实现点击图片将图片地址复制到粘贴板的方法,涉及js操作节点的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-02-02
  • javascript开发随笔二 动态加载js和文件

    javascript开发随笔二 动态加载js和文件

    js无非就是script标签引入页面,但当项目越来越大的时候,单页面引入N个js显然不行,合并为单个文件减少了请求数,但请求的文件体积却很大
    2011-11-11
  • Bootstrap中表单控件状态(验证状态)

    Bootstrap中表单控件状态(验证状态)

    这篇文章主要介绍了Bootstrap中表单控件状态(验证状态) 的相关资料,还给大家介绍了在Bootstrap框架中提供的机制验证效果,非常不错,需要的朋友可以参考下
    2016-08-08
  • 兼容IE和FF的js脚本代码小结(比较常用)

    兼容IE和FF的js脚本代码小结(比较常用)

    做BS开发就难免会用到javascript,而每个浏览器对javascript的支持有不同。这就需要我们程序员去兼容他们下面是兼容IE和FF的js脚本做法和分解(部分选自网上,经本人整理),希望对大家有帮助。
    2010-12-12
  • JavaScript里四舍五入函数round用法实例

    JavaScript里四舍五入函数round用法实例

    这篇文章主要介绍了JavaScript里四舍五入函数round用法,实例分析了round函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • JavaScript检测浏览器cookie是否已经启动的方法

    JavaScript检测浏览器cookie是否已经启动的方法

    这篇文章主要介绍了JavaScript检测浏览器cookie是否已经启动的方法,实例分析了javascript操作cookie的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • JS中的作用域链

    JS中的作用域链

    本文主要介绍了JS中的作用域链的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • JS上传前预览图片实例

    JS上传前预览图片实例

    上传图片对图片进行一下预览,可以了解图片上传后大概会是什么样子,此功能用js实现,然后在fileupload控件的change事件中调用,这样当用fileupload选择完图片以后,图片就会自动显示出来了。功能很简单,却很实用。
    2013-03-03
  • Array.prototype 的泛型应用分析

    Array.prototype 的泛型应用分析

    Array.prototype 的泛型应用分析,需要的朋友可以参考下。
    2010-04-04
  • bootstrap自定义样式之bootstrap实现侧边导航栏功能

    bootstrap自定义样式之bootstrap实现侧边导航栏功能

    bootstrap自带的响应式导航栏是向下滑动的,有时满足不了个性化的需求,需要做一个类似于android drawerLayout 侧滑的菜单,这就是我要实现的bootstrap自定义侧滑菜单。接下来通过本文给大家介绍bootstrap实现侧边导航栏功能,感兴趣的朋友一起看看吧
    2018-09-09

最新评论