eval解析字符串问题-阿里云开发者社区

开发者社区> ke_ry> 正文

eval解析字符串问题

简介: eval(string) 参数 描述 string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。 复制代码 var str = '{"name": "hanzichi", "age": 10}'; var obj = eval('(' + str + ')'); console.log(obj); // Object {name: "hanzichi", age: 10} 是否注意到,向 eval() 传参时,str 变量外裹了一层小括号?为什么要这样做? 我们先来看看 eval 函数的定义以及使用。
+关注继续查看
eval(string)
参数 描述
string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。


复制代码 var str = '{"name": "hanzichi", "age": 10}'; var obj = eval('(' + str + ')'); console.log(obj); // Object {name: "hanzichi", age: 10} 是否注意到,向 eval() 传参时,str 变量外裹了一层小括号?为什么要这样做? 我们先来看看 eval 函数的定义以及使用。 eval() 的参数是一个字符串。如果字符串表示了一个表达式,eval() 会对表达式求值。如果参数表示了一个或多个 JavaScript 声明, 那么 eval() 会执行声明。不要调用 eval() 来为算数表达式求值; JavaScript 会自动为算数表达式求值。 简单地说,eval 函数的参数是一个字符串,如果把字符串 "noString" 化处理,那么得到的将是正常的可以运行的 JavaScript 语句。 怎么说?举个栗子,如下代码: 复制代码 var str = "alert('hello world')"; eval(str); 执行后弹出 "hello world"。我们把 str 变量 "noString" 化,粗暴点的做法就是去掉外面的引号,内部调整(转义等),然后就变成了: 复制代码 alert('hello world') very good!这是正常的可以运行的 JavaScript 语句!运行之! 再回到开始的问题,为什么 JSON 字符串要裹上小括号。如果不加,是这个样子的: 复制代码 var str = '{"name": "hanzichi", "age": 10}'; var obj = eval(str); // Uncaught SyntaxError: Unexpected token : 恩,报错了。为什么会报错?试试把 str "noString" 化,执行一下: 复制代码 {"name": "hanzichi", "age": 10}; // Uncaught SyntaxError: Unexpected token : 毫无疑问,一个 JSON 对象或者说是一个对象根本就不是能执行的 JavaScript 语句!等等,试试以下代码: 复制代码 var str = '{name: "hanzichi"}'; var obj = eval(str); console.log(obj); // hanzichi 这又是什么鬼?但是给 name 加上 "" 又报错? 复制代码 var str = '{"name": "hanzichi"}'; var obj = eval(str); // Uncaught SyntaxError: Unexpected token : console.log(obj); 好吧,快晕了,其实还是可以将 str "nostring" 化,看看是不是能正确执行的 JavaScript 语句。前者的结果是: 复制代码 {name: "hanzichi"} 这确实是一条合法的 JavaScript 语句。{} 我们不仅能在 if、for 语句等场景使用,甚至可以在任何时候,因为 ES6 之前 JavaScript 只有块级作用域,所以对于作用域什么的并不会有什么冲突。去掉 {} 后 name: "hanzichi" 也是合法的语句,一个 label 语句,label 语句在跳出嵌套的循环中非常好用,具体可以参考 label,而作为 label 语句的标记,name 是不能带引号的,标记能放在 JavaScript 代码的任何位置,用不到也没关系。 一旦一个对象有了两个 key,比如 {name: "hanzichi", age: 10},ok,两个 label 语句?将 "hanzhichi" 以及 10 分别看做是语句,但是 语句之间只能用封号连接!(表达式之间才能用逗号)。所以改成下面这样也是没有问题的: 复制代码 var str = '{name: "hanzichi"; age: 10}'; var obj = eval(str); console.log(obj); // 10 越扯越远,文章开头代码的错误的原因是找到了,为什么套个括号就能解决呢?简单来说,() 会把语句转换成表达式,称为语句表达式。括号里的代码都会被转换为表达式求值并且返回,对象字面量必须作为表达式而存在。 本文并不会大谈表达式,关于表达式,可以参考文末链接。值得记住的一点是,表达式永远有一个返回值。大部分表达式会包裹在() 内,小括号内不能为空,如果有多个表达式,用逗号隔开,也就是所谓的逗号表达式,会返回最后一个的值。 说到表达式,不得不提函数表达式,以前翻译过一篇关于立即执行函数表达式的文章,可以参考下,文末。

  总结:

大家知道使用eval()函数可以将JSON格式字符串转换为对象直接量。

先看一段转换JSON字符串的代码实例:

[JavaScript] 纯文本查看 复制代码运行代码
1
2
var obj=eval('({"webName":"antzone","age":2,"address":"青岛市南区"})');
console.log(obj.webName);

由上面代码的运行结果可以看出,转换获得了成功,也可以看到,在JSON格式字符串外面又嵌套了一层小括号。

下面就来介绍这层小括号的作用,需要的朋友可以做一下参考。

eval()函数会创建一个执行环境,如果没有加小括号,{"webName":"antzone","age":2,"address":"青岛市南区"}会被解释成一个复合语句(大括号是用来构建复合语句的),那么"webName":和后面的内容也无法组成一个标签语句,直接就报错了,即便不是标准的JSON字符串,如{webName:"antzone",age:2,address:"青岛市南区"},webName:和后面的内容形成一个标签语句,"antzone"是一个字符串字面量,age就是一个变量,但是跟冒号就会报错。如果外面嵌套一个小括号,小括号是分组运算符,那么{"webName":"antzone","age":2,"address":"青岛市南区"}就是一个表达式,这时会被解读为一个对象直接量,就不会有任何问题了。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java字符串替换的问题
今天工作中遇到一个问题,需要输出mongodbObject中的部分内容,当我转换成字符串以后出现了好像无法替换的问题,经过验证,发现并非是不能替换,只是想法错误而已。package demo; /** * 输出字符串中的chenggongzhimu,shibai,count,123 * @author tuzongxun * */ public class Test19 { /
1159 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10052 0
fastjson解析json字符串,key缺少双引号导致下游服务无法解析
背景说明 在使用fastjson 1.2.60版本将对象转化为json字符串时,为处理Map值为null的情况,采用了WRITE_MAP_NULL_FEATURES属性,但该属性解析出来的key中缺少双引号,在key包含特殊字符时,如“-”和“:",下游服务在进行反序列化时出现无法解析的错误,从而出现问题。
3045 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10882 0
Python:number-parser解析数字字符串
Python:number-parser解析数字字符串
9 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13865 0
字符串 全排列生成问题
转自:http://blog.csdn.net/zinss26914/article/details/8939140 问题   输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路   1.
761 0
关于js中onclick字符串传参问题
规则: 外变是“”,里面就是‘’外边是‘’,里边就是“”   示例: var a="111"; var html="
574 0
json转换对象和字符串,实例解析
json转换对象和字符串,实例解析
15 0
+关注
ke_ry
开源技术专家
443
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载