javascript中eval解析JSON字符串


Posted in Javascript onFebruary 27, 2016

我们都知道,高级浏览器可以用  JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据,稍微欠妥点的做法,我们可以用 eval() 函数。

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

越扯越远,文章开头代码的错误的原因是找到了,为什么套个括号就能解决呢?简单来说,() 会把语句转换成表达式,称为语句表达式。括号里的代码都会被转换为表达式求值并且返回,对象字面量必须作为表达式而存在。

本文并不会大谈表达式,值得记住的一点是,表达式永远有一个返回值。大部分表达式会包裹在() 内,小括号内不能为空,如果有多个表达式,用逗号隔开,也就是所谓的逗号表达式,会返回最后一个的值。

Javascript 相关文章推荐
js解决select下拉选不中问题
Oct 14 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
常用的JavaScript模板引擎介绍
Feb 28 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 Javascript
js实现的在线调色板功能完整实例
Dec 21 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
详解如何在你的Vue项目配置vux
Jun 04 Javascript
解决layer弹出层自适应页面大小的问题
Sep 16 Javascript
javascript先序遍历DOM树的方法
Feb 27 #Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 #Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
Feb 27 #Javascript
JS原型、原型链深入理解
Feb 27 #Javascript
Javascript中Date类型和Math类型详解
Feb 27 #Javascript
原生javascript实现匀速运动动画效果
Feb 26 #Javascript
探索angularjs+requirejs全面实现按需加载的套路
Feb 26 #Javascript
You might like
我的论坛源代码(三)
2006/10/09 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
php中static和const关键字用法分析
2016/12/07 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
three.js 入门案例详解
2018/01/23 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
js实现简单的无缝轮播效果
2020/09/05 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
授权委托书公证
2014/09/14 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
骨干教师考核评语
2014/12/31 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
利用python调用摄像头的实例分析
2021/06/07 Python
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android
python基础之//、/与%的区别详解
2022/06/10 Python