成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript:根本沒有“JSON對象”這回事!

開發 前端
本文的主題是基于ECMAScript262-3來寫的,2011年的262-5新規范增加了JSON對象,和我們平時所說的JSON有關系,但是不是同一個東西,文章最后一節會講到新增加的JSON對象。

寫這篇文章的目的是經常看到開發人員說:把字符串轉化為JSON對象,把JSON對象轉化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯誤,請大家指出,多謝。

本文的主題是基于ECMAScript262-3來寫的,2011年的262-5新規范增加了JSON對象,和我們平時所說的JSON有關系,但是不是同一個東西,文章最后一節會講到新增加的JSON對象。

英文原文:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/

我想給大家澄清一下一個非常普遍的誤解,我認為很多JavaScript開發人員都錯誤地把JavaScript對象字面量(Object Literals)稱為JSON對象(JSON Objects),因為他的語法和JSON規范里描述的一樣,但是該規范里也明確地說了JSON只是一個數據交換語言,只有我們將之用在string上下文的時候它才叫JSON。

序列化與反序列化

2個程序(或服務器、語言等)需要交互通信的時候,他們傾向于使用string字符串因為string在很多語言里解析的方式都差不多。復雜的數據結構經常需要用到,并且通過各種各樣的中括號{},小括號(),叫括號<>和空格來組成,這個字符串僅僅是按照要求規范好的字符。

為此,我們為了描述這些復雜的數據結構作為一個string字符串,制定了標準的規則和語法。JSON只是其中一種語法,它可以在string上下文里描述對象,數組,字符串,數字,布爾型和null,然后通過程序間傳輸,并且反序列化成所需要的格式。YAML和XML(甚至request params)也是流行的數據交換格式,但是,我們喜歡JSON,誰叫我們是JavaScript開發人員呢!

字面量

引用Mozilla Developer Center里的幾句話,供大家參考:

◆ 他們是固定的值,不是變量,讓你從“字面上”理解腳本。 (Literals)

◆ 字符串字面量是由雙引號(")或單引號(')包圍起來的零個或多個字符組成的。(Strings Literals)

◆ 對象字面量是由大括號({})括起來的零個或多個對象的屬性名-值對。(Object Literals)

何時是JSON,何時不是JSON?

JSON是設計成描述數據交換格式的,他也有自己的語法,這個語法是JavaScript的一個子集。

{ "prop": "val" } 這樣的聲明有可能是JavaScript對象字面量也有可能是JSON字符串,取決于什么上下文使用它,如果是用在string上下文(用單引號或雙引號引住,或者從text文件讀取)的話,那它就是JSON字符串,如果是用在對象字面量上下文中,那它就是對象字面量。

  1. // 這是JSON字符串  
  2. var foo = '{ "prop": "val" }';  
  3.    
  4. // 這是對象字面量  
  5. var bar = { "prop": "val" }; 

而且要注意,JSON有非常嚴格的語法,在string上下文里{ "prop": "val" } 是個合法的JSON,但{ prop: "val" }和{ 'prop': 'val' }確實不合法的。所有屬性名稱和它的值都必須用雙引號引住,不能使用單引號。另外,即便你用了轉義以后的單引號也是不合法的,詳細的語法規則可以到這里查看

放到上下文里來看

大家伙可能嗤之以鼻:難道JavaScript代碼不是一個大的字符串?

當然是,所有的JavaScript代碼和HTML(可能還有其他東西)都是字符串,直到瀏覽器對他們進行解析。這時候.jf文件或者inline的JavaScript代碼已經不是字符串了,而是被當成真正的JavaScript源代碼了,就像頁面里的innterHTML一樣,這時候也不是字符串了,而是被解析成DOM結構了。

再次說一下,這取決于上下文,在string上下文里使用帶有大括號的JavaScript對象,那它就是JSON字符串,而如果在對象字面量上下文里使用的話,那它就是對象字面量。

真正的JSON對象

開頭已經提到,對象字面量不是JSON對象,但是有真正的JSON對象。但是兩者完全不一樣概念,在新版的瀏覽器里JSON對象已經被原生的內置對象了,目前有2個靜態方法:JSON.parse用來將JSON字符串反序列化成對象,JSON.stringify用來將對象序列化成JSON字符串。老版本的瀏覽器不支持這個對象,但你可以通過json2.js來實現同樣的功能。

如果還不理解,別擔心,參考一下的例子就知道了:

  1. // 這是JSON字符串,比如從AJAX獲取字符串信息  
  2. var my_json_string = '{ "prop": "val" }';  
  3.    
  4. // 將字符串反序列化成對象  
  5. var my_obj = JSON.parse( my_json_string );  
  6.    
  7. alert( my_obj.prop == 'val' ); //  提示 true, 和想象的一樣!  
  8.    
  9. // 將對象序列化成JSON字符串  
  10. var my_other_json_string = JSON.stringify( my_obj ); 

另外,Paul Irish提到Douglas Crockford在JSON RFC里用到了“JSON object”,但是在那個上下文里,他的意思是“對象描述成JSON字符串”不是“對象字面量”。

原文:http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html

【編輯推薦】

  1. 深入理解JavaScript之強大的原型和原型鏈
  2. JavaScript中的陷阱大集合
  3. 編寫高質量JavaScript代碼的基本要點
  4. 20個將JavaScript推到極致的網站
  5. JavaScript開發者必備的十款超級有用的工具
責任編輯:陳貽新 來源: 湯姆大叔的博客
相關推薦

2020-11-12 07:32:53

JavaScript

2019-11-11 10:48:44

面向對象語言

2023-02-27 08:10:16

2020-07-20 07:56:28

JavaScript開發技術

2021-09-23 16:50:19

芯片摩根士丹利半導體

2011-07-20 10:27:29

JavaScript

2018-06-04 08:40:20

磁盤分區MBR

2011-06-21 16:38:34

SEO

2023-05-10 16:10:28

數據分析數字化轉型

2023-07-25 16:06:57

JavaScript對象

2020-10-22 09:08:34

JavaScript

2020-06-29 19:11:47

4G網速工信部

2021-06-04 11:10:04

JavaScript開發代碼

2010-01-05 16:26:33

Javascript

2021-06-07 14:52:14

開源開發人員維護

2021-05-14 00:00:15

JavaScript開發代碼

2010-10-08 10:26:45

JavaScript內

2012-01-17 09:34:52

JavaScript

2021-04-07 10:12:05

Javascript對象拷貝開發

2017-04-21 09:07:39

JavaScript對象編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97国产精品| 91精品国产综合久久福利软件 | 欧美一级在线免费观看 | 国产精品久久久久久久久久久免费看 | 日韩亚洲视频在线 | 午夜视频免费在线 | 九九久久精品 | 欧美韩一区二区 | 中文字幕在线一区二区三区 | 91免费入口| 国产91精品在线 | 国产一区二区视频免费在线观看 | 久久久久亚洲 | a级黄色片视频 | 综合在线视频 | 涩爱av一区二区三区 | 欧美激情国产日韩精品一区18 | 亚洲欧美日韩国产综合 | 四虎影音| 欧美中文字幕 | 国产玖玖 | 精品视频在线免费观看 | 91国产精品在线 | 综合久久综合久久 | 国产精品一区二区久久 | 日韩电影免费在线观看中文字幕 | 精品欧美一区二区三区免费观看 | 亚洲va国产日韩欧美精品色婷婷 | 国产精品精品视频 | 久久久久久久一级 | 国产成视频在线观看 | 亚洲国产成人精品女人久久久 | 亚洲精品一区二区三区在线 | 亚洲一区二区日韩 | 四虎影院久久 | 精品一区二区三区免费毛片 | 国产高清视频 | 一区二区三区免费 | 亚洲网站在线播放 | www.97国产| 国产超碰人人爽人人做人人爱 |