eval函数的工作原理

eval函数的工作原理

eval函数会评估一个给定的含有JavaScript代码的字符串,并且试图去执行包含在字符串里的表达式或者一系列的合法的JavaScript语句。eval函数将把最后一个表达式或者语句所包含的值或引用作为返回值。

举例说明

  • eval评估JavaScript表达式
var bar = 'bar';
var foobar = eval('"foo" + bar');
alert(foobar);
  • eval评估JavaScript语句
var bar = 'bar';
// if variable bar equals 'bar', foobar is the result of
// last executing statement: bar="foo-bar";
var foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);// change the valuebar = 'foo';
// now our the last executed statement is: bar = "bar-foo";
// therefore the value of variable foobar has been changed
// into 'bar-foo'
foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);

JSON的格式

JSON的格式是由大括号和由冒号(:)构成的名值对所组成的。注意JSON格式与对象字面量 (object literals) 的区别:JSON的名字部分严格用引号+名字来表示。

举例说明

  • 对象的字面量
var objectLiteral = {
name: "Objector.L",
age: "24",
special: "JavaScript",
sayName: function() {
return this.name;
}
};
  • JSON对象
var jsonFormat = {
"summary": "Blogs",
"blogrolls": [
{
"title": "Explore JavaScript",
"link": "http://example.com/"
},
{
"title": "Explore JavaScript",
"link": "http://example.com/"
}
]
};

eval和JSON

由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象。利用eval函数无疑是一种简单而直接的方法。在转化的时候需要将JSON字符串的外面包装一层圆括号:

var jsonObject = eval("(" + jsonFormat + ")");

为什么要加括号?

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

alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

JSON格式的名字部分为什么要加引号?

因为eval函数会将{foo:”bar”}解释成合法的JavaScript语句,而非表达式。但是人们往往想要的是让eval将这段代码解释成一个对象。所以JSON格式会强制你去在名字的外侧加上引号再结合圆括号,这样eval就不会错误的将JSON解释成代码块。

举例说明

  • eval错误解析语义
alert(eval('{foo:"bar"}')); // return "bar", incorrect
  • eval正确解析JSON
alert(eval('({"foo": "bar"})')); // return JSON object, correct

结论

理解eval的工作原理和json的严格的限定格式,合理结合eval和json应用于JavaScript的数据传递和对象转换。

following this format:

eval('{' + jsonString + ')');

转载于:https://www.cnblogs.com/hgbgfg/p/5328181.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake使用入门

一、开胃菜 hello目录下的文件结构: ├── CMakeLists.txt ├── hello.c ├── hello.h └── main.c C代码见下节。 最简单的cmake配置文件: project(HELLO) set(SRC_LIST main.c hello.c) add_executable(hello ${SRC_LIST}) 如果要编译成gdb可调…

【pyqt5学习】——给窗口添加图标

from PyQt5.QtGui import QIcon# 当前文件的目录 self.dir os.path.dirname(os.path.abspath(__file__)) # 图标ico文件存放的绝对路径 icoPath self.dir r"\data\favicon.ico" # 添加图标 self.setWindowIcon(QIcon(icoPath))

C/C++语言变量声明内存分配

[cpp] view plaincopy<span style"font-family: Verdana, Arial, Helvetica, sans-serif; ">一个由c/C编译的程序占用的内存分为以下几个部分</span> 1、栈区&#xff08;stack&#xff09;— 程序运行时由编译器自动分配&#xff0c;存放函数的参数值…

sql server数据库实现保留指定位数小数的函数

有时候需要对一个特定的含有小数点的数字保留指定位数&#xff0c;比如“123.123600”。 在数据库中以函数的形式实现如下&#xff1a; USE [数据库名称] GO /****** Object: UserDefinedFunction [dbo].[AvgLimit] Script Date: 2016/12/29 11:30:44 ******/ SET ANSI_NUL…

Centos7下安装netstat

刚安装centos7发想没有查看端口的命令 netstat yum install net-tools转载于:https://www.cnblogs.com/cuizhipeng/p/5329811.html

【pyqt5学习】——items view相关控件(list view、table view)

目录 list view——列表视图 table view——表格视图 list view——列表视图 PyQt5-高级控件使用&#xff08;QListView&#xff09; - ygzhaof_100 - 博客园QListView用于展示数据&#xff0c;子类是QListWidget。QlistView基于模型Mode&#xff0c;需要程序创建Model然后保…

变量定义和声明的区别~~~概念上千万不要栽跟头!!!

变量的声明有两种情况&#xff1a; 1、一种是需要建立存储空间的。例如&#xff1a;int a 在声明的时候就已经建立了存储空间。 2、另一种是不需要建立存储空间的。 例如&#xff1a;extern int a 其中变量a是在别的文件中定义的。 声明是向编译器介绍名字&#xff0d;&…

解决Ajax不能跨域的方法

1. Ajax不能跨域请求的原因 同源策略(Same Origin Policy)&#xff0c;是一种约定&#xff0c;该约定阻止当前脚本获取或者操作另一个域下的内容。所有支持Javascript的浏览器都支持同源策略&#xff0c;也就是说浏览器可以隔离来自不同源的内容&#xff0c;阻止跨域请求的发生…

【pyqt5学习】——containers相关控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)

目录 1、tab widget 2、scroll area 2.1 使用方法 Step1.拖入QScrollArea ​Step2.改变widget控件布局 ​Step3.设置scrollAreaWidgetContents大小 3、Tool Box 4、Stacked Widget 4.1 案例展示 5、frame 6、MDI AREA 7、dock widget 7.1 悬浮状态 7.2 吸附状态 conta…

Java使用原子类进行多线程的 i++ 操作示例

2019独角兽企业重金招聘Python工程师标准>>> 使用AtomicInteger原子类进行 i 操作 可以有类似 synchronized 实现同步的效果。 原子操作是不能分割的整体&#xff0c;没有其他线程能够中断或检查正在原子操作中的变量。一个原子类型就是一个原子操作可用的类型&…

深入理解面向对象设计的七大原则

一&#xff0e;面向对象设计的七大原则是什么&#xff1f; 1.开放封闭原则 2.里氏转换原则 3.依赖倒转原则 4.组合/聚合原则 5.接口隔离原则 6.“迪米特”法则 7.单一职责原则 二&#xff0e;七大原则是什么含义&#xff1f; 序号 面向对象设计七大原则 偶的理解 1 …

mybatis实战教程(mybatis in action)之二:以接口的方式编程

前面一章&#xff0c;已经搭建好了eclipse,mybatis,mysql的环境&#xff0c;并且实现了一个简单的查询。请注意&#xff0c;这种方式是用SqlSession实例来直接执行已映射的SQL语句&#xff1a;session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID&…

Linux内核分析06

进程的描述和进程的创建 一&#xff0c;进程的描述 进程控制块PCB——task_struct &#xff08;进程描述符&#xff09;&#xff0c;为了管理进程&#xff0c;内核必须对每个进程进行清晰的描述&#xff0c;进程描述符提供了内核所需了解的进程信息。 struct task_struct数据结…

【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写

目录 一、说明 二、安装pyqt5以及相关工具&#xff08;pyqt5、pyuic、pqrcc&#xff09; 三、创建.ui文件 1、选中文件右键-external-pyqt5 打开GUI设计界面 2、创建一个界面&#xff08;内含四个等大label框&#xff09; 3、CTRLS保存 4、找到ui文件&#xff0c;右键--e…

zabbix3.0.4通过jmx监控tomcat

jdk下载页面http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm?AuthParam1462948138_871b75d4b1dd7155e8cbe4f23e5cd2cd脚本[rootNFS-WEB1 latest]# vim /e…

C#学习笔记——25个经典问题

1.静态成员和非静态成员的区别&#xff1f; 2.const 和 static readonly 区别&#xff1f; 3.extern 是什么意思&#xff1f; 4.abstract 是什么意思&#xff1f; 5.internal 修饰符起什么作用&#xff1f; 6.sealed 修饰符是干什么的&#xff1f; 7.override 和 o…

PHP的学习--RSA加密解密

PHP服务端与客户端交互或者提供开放API时&#xff0c;通常需要对敏感的数据进行加密&#xff0c;这时候rsa非对称加密就能派上用处了。 举个通俗易懂的例子&#xff0c;假设我们再登录一个网站&#xff0c;发送账号和密码&#xff0c;请求被拦截了。 密码没加密&#xff0c;那攻…

Swift学习

1、Swift网址 http://swiftdoc.org/ 2、 https://github.com/ipader/SwiftGuide 转载于:https://www.cnblogs.com/superbobo/p/5329876.html

【pyqt5学习】——最新版:配置external tools(designer、pyuic、pqrcc)

目录 1、pip install PyQt5 2、pip install pyqt5-tools 3、file-settings-tools-external tool 点击加号定义工具名字&#xff0c;名字随意便于区分即可 双击每一个工具名字&#xff0c;配置路径&#xff08;注意每一个exe的路径&#xff09; designer.exe pyuic.exe py…

Linux中vi命令详解

最近vi用的多&#xff0c;很多技巧不知道&#xff0c;备注一份&#xff0c; vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介绍一下它的用法和一小部分指令。由于 对Unix及Linux系统的任何版本&…