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 相关文章推荐
json字符串之间的相互转换示例代码
Aug 21 Javascript
JS实现超简单的仿QQ折叠菜单效果
Sep 21 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
jQuery中 $ 符号的冲突问题及解决方案
Nov 04 Javascript
Asp.Net之JS生成分页条的方法
Nov 23 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
d3.js实现立体柱图的方法详解
Apr 28 Javascript
vue路由跳转时判断用户是否登录功能的实现
Oct 26 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
解决layui弹框失效的问题
Sep 09 Javascript
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
如何利用 JS 脚本实现网页全自动秒杀抢购功能
Oct 12 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中使用灵巧的体系结构
2006/10/09 PHP
php中的数组操作函数整理
2008/08/18 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
JSON.stringify 语法实例讲解
2012/03/14 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
大学生标准推荐信范文
2013/11/25 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
期末评语大全
2014/05/04 职场文书
暑期教师培训方案
2014/06/07 职场文书
晚会闭幕词
2015/01/28 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
公司备用金管理制度
2015/08/04 职场文书
python神经网络ResNet50模型
2022/05/06 Python
设置IIS Express并发数
2022/07/07 Servers