深入理解 JavaScript(五)

來源:互聯網
上載者:User

標籤:line   代碼   目的   develop   開頭   logs   jquer   mozilla   基於   

根本沒有“JSON 對象”這回事!前言

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

本文

本文的主題是基於 ECMAScript262-3 來寫的,2011 年的 262-5 新規範增加了 JSON 對象,和我們平時所說的 JSON 有關係,但是不是同一個東西,文章最後一節會講到新增加的 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 裡的幾句話,供大家參考:

  1. 他們是固定的值,不是變數,讓你從“字面上”理解指令碼。 (Literals)
  2. 字串字面量是由雙引號(")或單引號(‘)包圍起來的零個或多個字元組成的。(Strings Literals)
  3. 對象字面量是由大括弧({})括起來的零個或多個對象的屬性名稱-值對。(Object Literals)
何時是 JSON,何時不是 JSON?

JSON 是設計成描述資料交換格式的,他也有自己的文法,這個文法是 JavaScript 的一個子集。 { "prop": "val" } 這樣的聲明有可能是 JavaScript 對象字面量也有可能是 JSON 字串,取決於什麼上下文使用它,如果是用在 string 上下文(用單引號或雙引號引住,或者從 text 檔案讀取)的話,那它就是 JSON 字串,如果是用在對象字面量上下文中,那它就是對象字面量。

// 這是JSON字串var foo = ‘{ "prop": "val" }‘;
// 這是對象字面量var bar = { "prop": "val" };

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

放到上下文裡來看

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

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

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

真正的 JSON 對象

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

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

// 這是JSON字串,比如從AJAX擷取字串資訊var my_json_string = ‘{ "prop": "val" }‘;
// 將字串還原序列化成對象var my_obj = JSON.parse( my_json_string );alert( my_obj.prop == ‘val‘ ); //  提示 true, 和想象的一樣!
// 將對象序列化成JSON字串var my_other_json_string = JSON.stringify( my_obj );

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

更多資料

如果你想瞭解更多關於 JSON 的資料,下面的串連對你絕對有用:

  • JSON specification
  • JSON RFC
  • JSON on Wikipedia
  • JSONLint - The JSON Validator
  • JSON is not the same as JSON

深入理解 JavaScript(五)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.