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接受和处理xml数据的代码(.net)
Mar 28 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
Nov 22 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
jQuery实现div浮动层跟随页面滚动效果
Feb 11 Javascript
JavaScript获取当前页面上的指定对象示例代码
Feb 28 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
JS实现弹出居中的模式窗口示例
Jun 20 Javascript
Javascript动画效果(4)
Oct 11 Javascript
JavaScript创建防篡改对象的方法分析
Dec 30 Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 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
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php命令行写shell实例详解
2018/07/19 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python break语句详解
2014/03/11 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
Python之字典对象的几种创建方法
2020/09/30 Python
Python图像读写方法对比
2020/11/16 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
本科生个人求职自荐信
2013/09/26 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
运动会广播稿500字
2014/01/28 职场文书
应届毕业生个人求职信范文
2014/01/29 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
经典洗发水广告词
2014/03/13 职场文书
班组长安全工作职责
2014/07/15 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
Pytorch可视化的几种实现方法
2021/06/10 Python