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 相关文章推荐
jquery实现ajax提交form表单的方法总结
Mar 03 Javascript
基于javascript实现简单计算器功能
Jan 03 Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 Javascript
js实现带农历和八字等信息的日历特效
May 16 Javascript
从零学习node.js之搭建http服务器(二)
Feb 21 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
纯js实现隔行变色效果
Nov 29 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
vue中动态设置meta标签和title标签的方法
Jul 11 Javascript
vue框架搭建之axios使用教程
Jul 11 Javascript
vue init webpack 建vue项目报错的解决方法
Sep 29 Javascript
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
JS中的多态实例详解
2017/10/15 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
应届生法律求职信
2013/10/22 职场文书
人事主管岗位职责范本
2013/12/04 职场文书
八年级语文教学反思
2014/02/11 职场文书
教师读书活动总结
2014/05/07 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
十佳少年事迹材料
2014/12/25 职场文书
2015国庆节宣传语
2015/07/14 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书