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.pswp.cn/news/255686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255686.shtml
英文地址,請注明出處:http://en.pswp.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系統的任何版本&…