澳门金莎娱乐手机版 服务器 JavaScript的eval JSON object问题_javascript技巧_脚本之家

JavaScript的eval JSON object问题_javascript技巧_脚本之家

通常的做法就是var jsonData =
eval。这看起来似乎一切都是正确的,但当你运行代码的时候,你会发现报“invalid
labe”错误了。为什么?我也不清楚,但我找到了解决这个问题的方法。
在我刚遇到这个问题的时候也特别头痛,因为看起来所有编码是正确的,为了测试出现问题的位置,我逐渐缩小代码范围,最终得到如下简短代码:
复制代码 代码如下: var jsonStr1 =
‘{“Name”:”Tom”,”Sex”:”Man”}’; var jsonObj1 = eval; alert;
以上代码执行正是报一开始说的invalid
labe错误。难道eval函数对某些表达式或对象有限制?于是我又测试了数组对象,代码如下,结果下面代码运行很正常:
复制代码 代码如下: var arrStr =
‘[“Tom”,”Man”]’; var arrObj = eval; alert;
难道是我机子上的JavaScript解析器就JSON解析方面出了问题,于是我又测试下面代码,但结果一样正常:
复制代码 代码如下: var jsonObj =
{“Name”:”Tom”,”Sex”:”Man”}; alert;
最终我还是没有自行把问题解决,于是根据相关错误信息上网搜索答案,没想到一下子就找到了问题的根源,解决办法就是“在eval的时候,要先把
JSON字符串值用
‘()’括号先括起来”。网上找的资料都没有说明是什么原因,当然我也还是没有明白正真的原因的。括号是起强制先执行或先运算作用的,返回的JSON就一个完整的对象,中间也没有表达式,为什么还要加括号!像数组这种较复杂点的对象也能正常eval。没办法,就先记着这种用法吧。正确用法如下:
复制代码 代码如下: var jsonStr2 =
‘{“Name”:”Tom”,”Sex”:”Man”}’; var jsonObj2 = eval; alert;

JSON
格式可以使对象(object)、数组(array)、值(value)、字符串(string)、数值(number)。

复制代码 代码如下:

<script type=”text/javascript”>
var user = {
“Name”:”Andy”,
“Sex” :”man”,
“Age” :”20″,
“Phone”:{“mobilephone”:”123456789″,”telephone”:”1234-12345678″},
“baby”:[{“big”:”xiaohong”},{“middle”:”xiaoming”},{“small”:”xiaoli”}]
//包含数组
}
alert(user.Name);
alert(user.Phone.mobilephone);
alert(user.baby[0].big);
user.baby[0].big = “–“;//修改了 JSON 值
alert(user.baby[0].big);
</script>

参考:

  下面来看看 JavaScript 的 eval 函数。
  eval
函数会评估给定的一个JavaScript代码的字符串,并试图去执行包含在字符串里的表达式或者一系列的合法的
JavaScript 语句。eval
函数将把最后一个表达式或者语句包含的值或引用作为返回值。

代码

复制代码 代码如下:

<script type=”text/javascript”>
var bar = “bar”;
var foobar = eval(‘”foo”+bar’);
alert(bar + foobar);//执行语句
foobar = eval(‘if(bar = “bar”){bar = “foo-bar”;}else{bar =
“bar-foo”;}’);
alert(foobar);//返回语句中包含的值
</script>

  JSON 和 对象字面量(Object Literals)的区别:JSON
的名字部分严格用引号+名字来表示。
代码

复制代码 代码如下:

<script type=”text/javascript”>
//对象字面量
var objectLiteral = {
name:”Objector.L”,
age:”24″,
special:”JavaScript”,
sayName:function(){
return this.name;
}
};
//JSON 对象
var jsonFormat = {
“summary”:”Blogs”,
“blogrolls”:[
{
“title”:”Explore JavaScript”,
“link”:””
},
{
“title”:”Explore JavaScript”,
“link”:””
}
]
};
</script>

  由于 Ajax 的兴起, JSON
这种轻量级的数据格式作为客户端与服务器端之间传输的格式逐渐流行起来,进而出现的问题是如何将服务器端构建好的
JSON 数据转换为可用的 JavaScript 对象,利用 eval
函数无疑是一种简单而直接的方法。在转化的时候需要将 JSON
字符串的外面包装一层园括号:

var jsonObject = eval(“(“+ jsonFormat +”)”)

  加园括号的目的是迫使 eval 函数在评估 JavaScript
代码的时候强制将括号内的表达式(expression)转换为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不佳加外层的括号,那么eval会将大括号之别为JavaScript代码块的开始结束标记机,那么{}将被认为是执行了一句空语句。所以下面两个执行结果是不同的:

复制代码 代码如下:

alert(eval(“{}”)); //return undefined
alert(eval(“({})”)); //return [object Object]

  JSON
格式的名字部分为什么要加引号?因为eval函数会将{foo:”bar”}解释成合法的JavaScript
语句,而非表达式。但人们往往是想让eval将这段代码解释成一个对象。所以JSON
格式会强制你去在名字的外侧加上引号,再结合圆括号,eval就不会错误的将JSON解释成代码块。
  

复制代码 代码如下:

//eval 错误解析语义
alert(eval(‘{foo:”bar”}’)); //return “bar”,incorrect
//eval 正确解析JSON
alert(eval(‘({“foo”:”bar”})’));//return JSON object,correct

格式可以使对象(object)、数组(array)、值(value)、字符串(string)、数值(number)。
复制代码 代码如下: script type=”text/javascript” var user = {
“Name”:…

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图