Javascript eval()函數 基礎回顧

如果您想詳細了解ev

al和JSON請參考以下鏈接:

eval? :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

JSON:http://www.json.org/

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/newsouls/p/3894539.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376769.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

雜感無題|

今天中午和組里面的人吃飯,聊起了科興跳樓的事情。這事其實前幾天我華為的mentor就轉給我了,當時也沒太在意,在脈脈上看了看,也不知曉是誰,想著可能又是抑郁癥吧。 飯后依舊繞著食堂散步,ly說那個人好像還是…

uva1366_Martian Mining_簡單DP

題目不難,卻想了好長時間,目測自己DP還是很水。。。囧 思路:舍f[i][j]為前i行j列的最大礦總量不難推出狀態轉移方程為f[i][j]max(f[i-1][j]line[i][j],f[i][j-1]row[j][i]) 其中line[i][j]為第i行前j個A礦的和(a[i][1]a[i][2]...a…

數學圖形之Boy surface

這是一個姓Boy的人發現的,所以取名為Boy surface.該圖形與羅馬圖形有點相似,都是三分的圖形.它甚至可以說是由羅馬曲面變化而成的. 本文將展示幾種Boy曲面的生成算法和切圖,使用自己定義語法的腳本代碼生成數學圖形.相關軟件參見:數學圖形可視化工具,該軟件免費開源.QQ交流群: …

開個定時器給echarts組件配置定時更新

我在js文件中開了個定時器,每1s從后端獲取數據并解析,然后用異步方法就渲染不出來,改成同步就可以了。 這個解決方法來自于這篇文章,我出的問題和他一樣:關于ajax中readyState的值一直為1的問題 這里將ajax參數修改為f…

SDK 操作 list-view control 實例 -- 遍歷進程

遍歷窗口,獲得控件句柄 1 EnumChildWindows(hwndDlg, (WNDENUMPROC)EnumChildProc, NULL); 回調函數 1 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam )2 {3 char strCLSName[MAXBYTE] {0};4 GetClassName(hwnd, strCLSName, MAXBYTE);5 if (…

推薦一份不錯的清除默認樣式的CSS樣式

時間過得真快,離 Reset CSS 研究(八卦篇) 已經 3 個多月了。廢話少說,趕緊將技術篇寫完吧。 回顧與反思 第一份 reset css 是 Tantek 的 undohtml.css, 很簡單的代碼,Tantek 根據自己的需要,對瀏覽器的默認…

python深淺拷貝

在python中,對象賦值實際上是對象的引用。當創建一個對象,然后把它賦給另一個變量的時候,python并沒有拷貝這個對象,而只是拷貝了這個對象的引用。 所以一個結構類型被賦給另外一個對象的時候,盡可能不使用 &#xff…

Flash中的SLC/MLC/MLC--基礎

參考 1.http://www.upantool.com/jiaocheng/qita/2012/slc_mlc_tlc.html 2.http://www.2ic.cn/html/10/t-432410.html 3.http://kms.lenovots.com/kb/article.php?id15382 4.http://www.albertknight.com/222.html 5.http://ssd.zol.com.cn/371/3716632.html 6.這個圖比較多 h…

python定義對象的比較方法

有時候我們需要比較兩個對象。比如哪個對象大,哪個對象小。如果我們不告訴python如何比較,那么Python是不知道如何進行比較的。 下面提供實例 #__eq__(self,other): #在使用比較運算符比較兩個對象是否相等的時候會調用這個方法。 #如果是相等,那么應該返…

關于Oracle Insert 語句的子查詢 和 with check option的用法

今日睇ocp教程 發現 insert語句還可以子查詢例如:INSERT INTO (SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id FROM employees where department_id 50 )VALUES (9999…

apple mac 下使用機械鍵盤的辦法,鍵盤映射工具軟件,apple mac Mechanical keyboard

apple mac 下使用機械鍵盤的辦法,鍵盤映射工具軟件,apple mac Mechanical keyboard 想在蘋果電腦 mac 系統下使用 機械鍵盤,大部分機械鍵盤不是為mac設計的,所以需要用軟件做一下鍵盤映射。 推薦使用這個:https://pqrs…

Python中鍵映射多個值的方法:defaultdict

Python中鍵映射多個值的方法有兩種: 想保持元素的插入順序就應該使用列表; 想去掉重復元素就使用集合并且不關心元素的順序問題的話應該使用set from collections import defaultdictmapping defaultdict(list)mapping [key].append(value)mapping d…

該不該讓Google收錄WordPress的目錄頁和標簽頁?

只要有一點SEO知識的 站長都會注意利用相關文件和元標簽來控制Google對網站的收錄,對于WordPress網站來說,除了我們主動添加的內容頁面,Google還會收錄目錄歸檔頁,標簽歸檔頁,時間歸檔頁,以及作者歸檔頁。這…

【原創】MapReduce編程系列之表連接

問題描述需要連接的表如下:其中左邊是child,右邊是parent,我們要做的是找出grandchild和grandparent的對應關系,為此需要進行表的連接。 Tom Lucy Tom Jim Lucy David Lucy Lili Jim Lilei Jim SuSan Lily Green Lily Bians Green…

python logging模塊簡單使用

logging 是線程安全的,也就是說,在一個進程內的多個線程同時往同一個文件寫日志是安全的。 但是多個進程往同一個文件寫日志不是安全的。 import loggingLOG_FORMAT "%(asctime)s - %(levelname)s - %(message)s" DATE_FORMAT "%m/%d/…

OpenACC 中parallel 和kernels的區別

Kernels構件 Kernels構件源于PGI Accelerator模型的region構件。嵌套kernels構件里的循環可能會被編譯器轉換成能在GPU上高效并行的部分。在這個過程中有三步。 1:判斷并行中遇到的循環。 2:把抽象的并行轉換成硬件上的并行。對于NVIDIA CUDA GPU&#…

ORACLE基本SQL語句-查詢篇

一、普通查詢 /*查詢表數據*/select * from STU /*取出前3行數據*/select * from stu where ROWNUM<3 /*模糊查詢*/select * from stu where stu_id like stu001% 說明&#xff1a;通配符“%”代表一個或者多個字符&#xff0c;通配符“_”代表一個字符。 /*別名*/select S…

三次握手建立失敗的幾種情況以及三次握手的理解

上面的圖是阻塞式socket進行通信的過程&#xff0c;阻塞的時候是操作系統內核網絡協議棧在工作 調用 connect 函數將激發 TCP 的三次握手過程&#xff0c;而且僅在連接建立成功或出錯時才返回。其中出錯返回可能有以下幾種情況&#xff1a; 1、三次握手無法建立&#xff0c;客…

db_name,instance_name,service_names,db_domain,dbid,oracle_sid等區別與聯系

最近整理了一篇文章&#xff1a;oracle listener 有網友對數據庫是否顯式設置了instance_name和service_names提出疑問。 由此引發出db_name,instance_name,oracle_sid等等這些常見的參數都代表什么意思&#xff0c;怎么取值的&#xff0c;有什么區別&#xff1f; SQL> sele…

檢測版本更新

如果我們要檢測app版本的更新&#xff0c;那么我們必須獲取當前運行app版本的版本信息和appstore 上發布的最新版本的信息。 當前運行版本信息可以通過info.plist文件中的bundle version中獲取&#xff1a; [cpp] view plaincopy NSDictionary *infoDic [[NSBundle mainBundle…