摘要:更多資料如果你想了解更多關(guān)于的資料,下面的連接對(duì)你絕對(duì)有用關(guān)于本文本文轉(zhuǎn)自大叔的深入理解系列。深入理解系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,原文是大叔的一個(gè)非常不錯(cuò)的專題,現(xiàn)將其重新整理發(fā)布。
前言
寫(xiě)這篇文章的目的是經(jīng)常看到開(kāi)發(fā)人員說(shuō):把字符串轉(zhuǎn)化為JSON對(duì)象,把JSON對(duì)象轉(zhuǎn)化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯(cuò)誤,請(qǐng)大家指出,多謝。
正文本文的主題是基于ECMAScript262-3來(lái)寫(xiě)的,2011年的262-5新規(guī)范增加了JSON對(duì)象,和我們平時(shí)所說(shuō)的JSON有關(guān)系,但是不是同一個(gè)東西,文章最后一節(jié)會(huì)講到新增加的JSON對(duì)象。
英文原文:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/
我想給大家澄清一下一個(gè)非常普遍的誤解,我認(rèn)為很多JavaScript開(kāi)發(fā)人員都錯(cuò)誤地把JavaScript對(duì)象字面量(Object Literals)稱為JSON對(duì)象(JSON Objects),因?yàn)樗恼Z(yǔ)法和JSON規(guī)范里描述的一樣,但是該規(guī)范里也明確地說(shuō)了JSON只是一個(gè)數(shù)據(jù)交換語(yǔ)言,只有我們將之用在string上下文的時(shí)候它才叫JSON。
定義JSON(JavaScript Object Notation)是一種由道格拉斯·克羅克福特構(gòu)想設(shè)計(jì)、輕量級(jí)的數(shù)據(jù)交換語(yǔ)言,以文字為基礎(chǔ),且易于讓人閱讀。盡管JSON是Javascript的一個(gè)子集,但JSON是獨(dú)立于語(yǔ)言的文本格式,并且采用了類似于C語(yǔ)言家族的一些習(xí)慣。
詳細(xì)定義:https://zh.wikipedia.org/wiki/JSON
序列化與反序列化兩個(gè)個(gè)程序(或服務(wù)器、語(yǔ)言等)需要交互通信的時(shí)候,他們傾向于使用string字符串因?yàn)?b>string在很多語(yǔ)言里解析的方式都差不多。復(fù)雜的數(shù)據(jù)結(jié)構(gòu)經(jīng)常需要用到,并且通過(guò)各種各樣的中括號(hào){},小括號(hào)(),叫括號(hào)<>和空格來(lái)組成,這個(gè)字符串僅僅是按照要求規(guī)范好的字符。
為此,我們?yōu)榱嗣枋鲞@些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)作為一個(gè)string字符串,制定了標(biāo)準(zhǔn)的規(guī)則和語(yǔ)法。JSON只是其中一種語(yǔ)法,它可以在string上下文里描述對(duì)象,數(shù)組,字符串,數(shù)字,布爾型和null,然后通過(guò)程序間傳輸,并且反序列化成所需要的格式。YAML和XML(甚至request params)也是流行的數(shù)據(jù)交換格式,但是,我們喜歡JSON,誰(shuí)叫我們是JavaScript開(kāi)發(fā)人員呢!
字面量引用Mozilla Developer Center里的幾句話,供大家參考:
字面值:字面值是由語(yǔ)法表達(dá)式定義的常量;或,通過(guò)由一定字辭組成的語(yǔ)詞表達(dá)式定義的常量。 (Literals
字符串字面值可以包含有零個(gè)或多個(gè)字符,由雙引號(hào)(")對(duì)或單引號(hào)(‘)對(duì)包圍。字符串被限定在同種引號(hào)之間;也即,必須是成對(duì)單引號(hào)或成對(duì)雙引號(hào)。(Strings Literals)
對(duì)象字面值是封閉在花括號(hào)對(duì)({})中的一個(gè)對(duì)象的零個(gè)或多個(gè)"屬性名-值"對(duì)的(元素)列表。(Object Literals)
何時(shí)是JSON,何時(shí)不是JSON?JSON是設(shè)計(jì)成描述數(shù)據(jù)交換格式的,他也有自己的語(yǔ)法,這個(gè)語(yǔ)法是JavaScript的一個(gè)子集。
{ "prop": "val" } 這樣的聲明有可能是JavaScript對(duì)象字面量也有可能是JSON字符串,取決于在什么上下文使用它,如果是用在string上下文(用單引號(hào)或雙引號(hào)引住,或者從text文件讀取)的話,那它就是JSON字符串,如果是用在對(duì)象字面量上下文中,那它就是對(duì)象字面量。
// 這是JSON字符串 var foo = "{ "prop": "val" }"; // 這是對(duì)象字面量 var bar = { "prop": "val" };
而且要注意,JSON有非常嚴(yán)格的語(yǔ)法,在string上下文里{ "prop": "val" } 是個(gè)合法的JSON,但{ prop: "val" }和{ "prop": "val" }卻是不合法的。所有屬性名稱和它的值都必須用雙引號(hào)引住,不能使用單引號(hào)。另外,即便你用了轉(zhuǎn)義以后的單引號(hào)也是不合法的,詳細(xì)的語(yǔ)法規(guī)則可以到這里查看。
放到上下文里來(lái)看大家伙可能嗤之以鼻:難道JavaScript代碼不是一個(gè)大的字符串?
當(dāng)然是,所有的JavaScript代碼和HTML(可能還有其他東西)都是字符串,直到瀏覽器對(duì)他們進(jìn)行解析。這時(shí)候.js文件或者inline的JavaScript代碼已經(jīng)不是字符串了,而是被當(dāng)成真正的JavaScript源代碼了,就像頁(yè)面里的innterHTML一樣,這時(shí)候也不是字符串了,而是被解析成DOM結(jié)構(gòu)了。
再次說(shuō)一下,這取決于上下文,在string上下文里使用帶有大括號(hào)的JavaScript對(duì)象,那它就是JSON字符串,而如果在對(duì)象字面量上下文里使用的話,那它就是對(duì)象字面量。
真正的JSON對(duì)象開(kāi)頭已經(jīng)提到,對(duì)象字面量不是JSON對(duì)象,但是有真正的JSON對(duì)象。但是兩者完全不一樣概念,在現(xiàn)代的瀏覽器里JSON對(duì)象已經(jīng)被原生的內(nèi)置對(duì)象了,目前有2個(gè)靜態(tài)方法:JSON.parse()用來(lái)將JSON字符串反序列化成對(duì)象,JSON.stringify()用來(lái)將對(duì)象序列化成JSON字符串。老版本的瀏覽器(如ie6)不支持這個(gè)對(duì)象,但你可以通過(guò)json2.js或者json3.js來(lái)實(shí)現(xiàn)同樣的功能。
如果還不理解,別擔(dān)心,參考一下的例子就知道了:
// 這是JSON字符串,比如從AJAX獲取字符串信息 var my_json_string = "{ "prop": "val" }"; // 將字符串反序列化成對(duì)象 var my_obj = JSON.parse( my_json_string ); alert( my_obj.prop == "val" ); // 提示 true, 和想象的一樣! // 將對(duì)象序列化成JSON字符串 var my_other_json_string = JSON.stringify( my_obj );
另外,Paul Irish提到Douglas Crockford在JSON RFC里用到了“JSON object”,但是在那個(gè)上下文里,他的意思是“對(duì)象描述成JSON字符串”不是“對(duì)象字面量”。
更多資料如果你想了解更多關(guān)于JSON的資料,下面的連接對(duì)你絕對(duì)有用:
JSON specification
JSON RFC
JSON on Wikipedia
JSONLint - The JSON Validator
JSON is not the same as JSON
關(guān)于本文本文轉(zhuǎn)自TOM大叔的深入理解JavaScript系列。聲明一下,本人所有整理的文章均不是照搬全抄,加入自己的理解和詳細(xì)的注解,以及修改了一些語(yǔ)病錯(cuò)字等。
【深入理解JavaScript系列】文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,原文是TOM大叔的一個(gè)非常不錯(cuò)的專題,現(xiàn)將其重新整理發(fā)布。謝謝大叔。如果你覺(jué)得本文不錯(cuò),請(qǐng)幫忙點(diǎn)個(gè)推薦,支持一把,感激不盡。
更多優(yōu)秀文章歡迎關(guān)注我的專欄
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/78494.html
摘要:為此決定自研一個(gè)富文本編輯器。本文,主要介紹如何實(shí)現(xiàn)富文本編輯器,和解決一些不同瀏覽器和設(shè)備之間的。 對(duì)ES6Generator函數(shù)的理解 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同。 JavaScript 設(shè)計(jì)模式 ② 巧用工廠模式和創(chuàng)建者模式 我為什么把他們兩個(gè)放在一起講?我覺(jué)得這兩個(gè)設(shè)計(jì)模式有相似之處,有時(shí)候會(huì)一個(gè)設(shè)計(jì)模式不能滿...
摘要:,指的對(duì)象表示法,它本身是個(gè)字符串,是一種數(shù)據(jù)交換格式,并非對(duì)象。字符串必須使用雙引號(hào)表示,不能使用單引號(hào)。數(shù)組或?qū)ο笞詈笠粋€(gè)成員的后面,不能有逗號(hào)。不合法的會(huì)在解析成對(duì)象時(shí),出現(xiàn)錯(cuò)誤。替代方法對(duì)象下雖然提供了完整的字符串和對(duì)象的轉(zhuǎn)換方法。 JSON(JavaScript Object Notation),指JavaScript的對(duì)象表示法,它本身是個(gè)字符串,是一種數(shù)據(jù)交換格式,并非對(duì)...
摘要:系列一初識(shí)系列二組件的和系列三組件的生命周期是推出的一個(gè)庫(kù),它的口號(hào)就是用來(lái)創(chuàng)建用戶界面的庫(kù),所以它只是和用戶界面打交道,可以把它看成中的視圖層。系列一初識(shí)系列二組件的和系列三組件的生命周期 React系列---React(一)初識(shí)ReactReact系列---React(二)組件的prop和stateReact系列---React(三)組件的生命周期 showImg(https://...
摘要:目標(biāo)階段真正點(diǎn)擊的元素的事件發(fā)生了兩次,因?yàn)樵谏厦娴拇a中,既在捕獲階段綁定了事件,又在冒泡階段綁定了事件,所以發(fā)生了兩次。所以很明顯用直接綁定的事件發(fā)生在了冒泡階段。 如果對(duì)事件大概了解,可能知道有事件冒泡這回事,但是冒泡、捕獲、傳播這些機(jī)制可能還沒(méi)有深入的研究實(shí)踐一下,我抽時(shí)間整理了一下相關(guān)的知識(shí)。 本文主要對(duì)事件機(jī)制一些細(xì)節(jié)進(jìn)行討論,過(guò)于基礎(chǔ)的事件綁定知識(shí)方法沒(méi)有介紹。 特別少...
閱讀 3653·2021-10-11 10:58
閱讀 2245·2021-10-08 10:05
閱讀 2024·2021-09-27 13:34
閱讀 3558·2019-08-30 15:53
閱讀 2723·2019-08-30 14:02
閱讀 3551·2019-08-29 16:55
閱讀 614·2019-08-29 15:41
閱讀 1062·2019-08-29 15:23