Foundations of Ajax 和 Ajax in Action 都沒把 JavaScript 中以大括號宣告物件的方式(稱作 Object Initializer 或 Object Literal)和 JSON 講正確,都把 Object Literal 講成是 JSON
Foundations of Ajax 是在 68、69 頁之間有點小誤導,Ajax in Action 則是在 B.2.1 完全講錯,還說 JSON 是 JavaScript 的核心特性(The JavaScript Object Notation (JSON) is a core feature of the language.)
Object Literal 才是 JavaScript 核心特性,JSON 是學 Object Literal 的部分語法而成的,一個資料交換的文字格式
所以絕對不可以說在 JavaScript 中以大括號選告物件是 JSON,它是 Object Literal,例如
var cat = { name: "Kitty", miaow: function() { return "喵喵喵" } }; // 這是 Object Literal,不是 JSON // 這是 Object Literal,不是 JSON // 這是 Object Literal,不是 JSON
Object Literal 屬性名稱可以不加引號,但 JSON 中那裡得是一個字串,一定要加引號,而且 JSON 不支援函式,所以:
// 把上面 object literal 屬性加上引號當成字串 var s = '{"name": "Kitty", "miaow": function() { return "喵喵喵" }}'; // 用 JSON 的 JavaScript library 去 parse 回 JavaScript 物件 var o = s.parseJSON(); // 這是 parse 不出來的,因為 JSON 不支援函式 // JSON library 會丟出 parseJSON 的 error - throw new SyntaxError("parseJSON");
將 cat 物件用 JSON 的 JavaScript library 輸出 JSON 字串,也不會包含函式部分
cat.toJSONString() // '{"name":"Kitty"}'
雖然字串 s 如果用 eval 可以成功變回 object
var o = eval('(' + s + ')'); o.name // "Kitty" o.miaow() // "喵喵喵"
不過這是因為 eval 接受的是 JavaScript,s 是一個合法的 Object Literal 所以 eval 接受,但 s 不是一個合法的 JSON
JSON 格式是 Object Literal 的子集,所以合法 JSON 資料,eval 一定接受,反過來則不一定,合法的 Object Literal 不見得符合 JSON 格式
- 留言者: 小笨笨
- Email: pbird123@secureix.com
- 網址:
- 日期: 2007-05-09 00:59:36
「JSON is a subset of the object literal notation of JavaScript」!?
有時候看了wikipedia上面的說明,會讓人困惑