eval解析字符串问题

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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":"青岛市南区"}就是一个表达式,这时会被解读为一个对象直接量,就不会有任何问题了。

 

目录
相关文章
|
5月前
|
算法 测试技术 C#
【解析几何】 【多源路径】 【贪心】1520 最多的不重叠子字符串
【解析几何】 【多源路径】 【贪心】1520 最多的不重叠子字符串
|
5月前
|
JavaScript 前端开发 Java
正则表达式深度解析:匹配任意字符串
【4月更文挑战第1天】
2589 0
|
5月前
|
存储 安全 C语言
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
119 0
|
5月前
|
存储 C语言
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))
c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))
106 0
|
1月前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
51 5
|
2月前
|
存储 关系型数据库 MySQL
|
3月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
3月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
244 1
|
4月前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
|
5月前
|
SQL 存储 JSON
Hive 解析 JSON 字符串数据的实现方式
Hive 提供 `get_json_object` 函数解析 JSON 字符串,如 `{"database":"maxwell"}`。`path` 参数使用 `$`、`.`、`[]` 和 `*` 来提取数据。示例中展示了如何解析复杂 JSON 并存储到表中。此外,Hive 3.0.0及以上版本内置 `JsonSerDe` 支持直接处理 JSON 文件,无需手动解析。创建表时指定 `JsonSerDe` 序列化器,并在 HDFS 上存放 JSON 文件,可以直接查询字段内容,方便快捷。

热门文章

最新文章

推荐镜像

更多