JavaScript eval() 函数

定义和用法

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

语法

eval(string)
参数 描述
string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

返回值

通过计算 string 得到的值(如果有的话)。

说明

该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。

抛出

如果参数中没有合法的表达式和语句,则抛出 SyntaxError 异常。

如果非法调用 eval(),则抛出 EvalError 异常。

如果传递给 eval() 的 Javascript 代码生成了一个异常,eval() 将把该异常传递给调用者。

例子 1

在本例中,我们将在几个字符串上运用 eval(),并看看返回的结果:

<script type="text/javascript">

eval("x=10;y=20;document.write(x*y)")

document.write(eval("2+2"))

var x=10
document.write(eval(x+17)) </script>

输出:

200
4
27

例子 2

看一下在其他情况中,eval() 返回的结果:

eval("2+3")    // 返回 5
var myeval = eval; // 可能会抛出 EvalError 异常
myeval("2+3"); // 可能会抛出 EvalError 异常

可以使用下面这段代码来检测 eval() 的参数是否合法:

try  {
alert("Result:" + eval(prompt("Enter an expression:","")));
} catch(exception) {
alert(exception);
}

 ----------------------------------------------eval()解析JSON字符串----------------------------------------------------

 0.eval解析函数:

  JSON 不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数。

var text = '{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}';
var obj = JSON.parse(text);
obj.alexa = eval("(" + obj.alexa + ")"); document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();

1.JSON字符串转换为对象的两种方法

        //将JSON字符串转为JS对象的方法一
var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');
document.write(obj.name + "<br/>");
//将JSON字符串转为JS对象的方法二
//JSON格式的字符串
var test1 = '{"name":"qlq","age":25}';
var obj2 = eval("(" + test1 + ")"); //必须带圆括号
document.write(obj2.name + "<br/>" + obj2.age);

结果:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGMAAAA5CAIAAACtTAJTAAAB20lEQVR4nO2bQXLDIAxFuREn4kDchsNwn3bhJAghwe9Mp6b4v12CIPjNCGOZhC+CEe6ewL+BplBoCmUzUyWFkMrdszChKRSaQjFMXbMtKYQQYq569jXHEHMVoTXHcPH+vkUGs+Xq+UYMrgfcSJtjSk5xYepjoeYojJQkBylJNPWBNccW2A2out2MY0pOb2FKhLbI7vJV23D5YkTdJn/sZtzscz+P2WdEjuvNp5tx8ZN++yxcNIUCmFKXJhPENTXqmNg4JvsGN4Cp31nRx9XuRhBT8p4ec0GyT/UaBvQ2EHKHstcmYbed58bQFApNodAUCk2h0BQKTaHQFApNofzM1EaPYX8OTaHQFIptSjzAxpzbc68y5YUdiWGqq3W8ZBimJmFHMpqyimmGqVnYkQymZtVK0TgNOxKaQrGzT5fRnezzwo7EezPaluoUTVOzsCOxdwmybl7N7JuGHQmw8wQV0BRNXdAUCqsuKDSFQlMoNIVCUyg0hQJU8vqTKJKTNwUDdiWv6enKUKdvmaYss0+fHqMpD5p6sTI1ZN8zF6mvlSn35Hx/VPMRTEzNq5jH1zg1rqnlHzGetmj5Nc9Fbj3udfLqzaikJOdI+SMw32JpugP4D7318bkPhqZQvgEX7b+7ugiBmgAAAABJRU5ErkJggg==" alt="" />

为什么要 eval这里要添加 eval("(" + test1 + ")")//”呢?

原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将 括号内的表达式(expression)转化为对象,而不是作为语 句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始 和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

对于这种写法,在JS中,可以到处看到。

如: (function()) {}();  做闭包操作时等。

alert(dataObj.root.length);//输出root的子对象数量
$.each(dataObj.root,fucntion(idx,item){
if(idx==0){
return true;
}
//输出每个root子对象的名称和值
alert("name:"+item.name+",value:"+item.value);
})
注:对于一般的js生成json对象,只需要将$.each()方法替换为for语句即可,其他不变。

2.对于服务器返回的JSON字符串,如果jquery异步请求将
type(一般为这个配置属性)设为“json”,或者利
用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可,这
里以$.getJSON方法为例说明数据处理方法:
$.getJSON("http://www.phpzixue.cn/",{param:"gaoyusi"},function(data){
//此处返回的data已经是json对象
//以下其他操作同第一种情况
$.each(data.root,function(idx,item){
if(idx==0){
return true;//同countinue,返回false同break
}
alert("name:"+item.name+",value:"+item.value);
});
});
这里特别需要注意的是方式1中的eval()方法是动态执行其中字符串(可能是js脚本)的,这样很容易会造成系统的安全问题。所以可以采用一些规避了eval()的第三方客户端脚本库,比如JSON in JavaScript就提供了一个不超过3k的脚本库。

补充:eval()解析的JSON的key可以不带"

  一般的JSON的key必须带双引号,也就是类似于{"key":"vslue"}的形式,但是如果用eval("("+json+")")的形式解析字符串为JSON的时候,json可以写为{key:"value"}

JS的全局函数eval解析JSON字符串的更多相关文章

  1. eval解析JSON字符串的一个小问题

    之前写过一篇 关于 JSON 的介绍文章,里面谈到了 JSON 的解析.我们都知道,高级浏览器可以用 JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据,稍微欠妥点的做法 ...

  2. eval解析json字符串

    场景:在springMVC,手动拼接的list,转成本json字符串后,传到前台, 解决:需要解析成json对象,获取对象的属性,动态生成table. 首先,以下是后台准备好的list,list中有两 ...

  3. js中eval详解,用Js的eval解析JSON中的注意点

    先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...

  4. JS解析JSON字符串

    问题描述:后台需要传递给前台一些数据,用于页面数据显示,因为是一些Lable标签,所以数据传递到前台需要解析. 思路:因为数据比较杂乱,所以我选择传递的数据类型是Json格式,但是数据展示时需要解析成 ...

  5. T-SQL解析json字符串函数

    T-SQL解析json字符串函数及其使用示例 参考博文:http://www.cnblogs.com/huangtailang/p/4277809.html 1.解析json字符串函数,返回表变量 A ...

  6. jquery : eval() 解析json的注意

    jquery eval解析JSON中的注意点介绍 来在:http://www.jb51.net/article/40842.htm 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: ...

  7. JavaScript基础11——js的全局函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. js的全局函数

    JS的全局函数,全局函数和window对象的函数不一样. 全局函数不属于任何一个内置对象. JS包含以下7个全局函数,用于一些常用的功能: escape(),unescape(); //编码,解码. ...

  9. 解析Json字符串的三种方法

    在很多时候,我们的需要将类似 json 格式的字符串数据转为json, 下面将介绍日常中使用的三种解析json字符串的方法 1.首先,我们先看一下什么是 json 格式字符串数据,很简单,就是 jso ...

随机推荐

  1. sqlserver-触发器-判断更新了哪个字段。

    create trigger 触发器名称on 表名(将触发器创建到那张表中)for updateasif update(判断更新字段)beginupdate (要更新的表名) set 字段=inser ...

  2. SQL Server Management Studio(SSMS)的使用与配置整理

    目录 目录 SQL Server Management Studio的使用与配置 1 设置SSMS显示行号 2 添加注释与取消注释的快捷键 3 新建查询的快捷键 4 开启sql语句TIME与IO的统计 ...

  3. 【hdu5306】Gorgeous Sequence 线段树区间最值操作

    题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y ...

  4. 【Visual Installer】如何注册自已的文件类型

    一.前言 这几天在做公司软件产品的安装包,产品有一个特定的后缀名为:.isbimqs,需要的功能是双击该后缀名文件后,会有一个启动程序launchRevit.exe去打开Revit,由Revit去打开 ...

  5. 【BZOJ4522】密匙破解(Pollard_rho)

    [BZOJ4522]密匙破解(Pollard_rho) 题面 BZOJ 洛谷 题解 还是\(Pollard\_rho\)的模板题. 呜... #include<iostream> #inc ...

  6. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  7. Canny边缘检测原理及C#程序实现

    http://blog.csdn.net/yjz_uestc/article/details/6664937 Canny边缘检测是被公认的检测效果最好的边缘检测方法,是由John F. Canny于1 ...

  8. pthread在Qt+Windows下的使用

    pthread是牛逼的跨平台线程库,无需多介绍. 下载pthread-win32,解压后将x86里的pthreadVC2.dll放到system32目录里,将pthreadVC2.lib放入项目中去, ...

  9. turn服务部署

    centos7.2 git clone https://github.com/coturn/coturnyum -y install openssl-develyum install openssl ...

  10. 启动EMQ(emqtt)时报错找不到libsctp.so.1

    libsctp.so.1: cannot open shared object file: No such file or directory   发现没有安装sctp   [root@localho ...