// json字符串
var jsonStr = '{ "name":"Zhang", "age":3, "course": { "name": "HTML5" } }';
// json數(shù)據(jù)
{ "name":"Zhang", "age":3, "course": { "name": "HTML5" } }
// js對象字面量
var obj = { name: "Zhang", age:3, course: { name: "HTML5" } };
json 字符串就是一個字符串,String 類型,與其他兩者就是數(shù)據(jù)類型的差別,就像字符串 "1" 和數(shù)值 1 一樣。
json 是一種跨語言的約定俗稱的數(shù)據(jù)格式,與 js 對象的差別看起來只是屬性加了引號而已,使用時可以當(dāng)做 js 對象來使用,甚至類型測試和原型樹都與 Object 有扯不開的聯(lián)系。
var json = {"a" : 1};
console.log(typeof json) // object
console.log(json instanceof Object) // true
console.log([].toString.call(json)) // [object Object]
console.log(json.constructor) // function Object() { }
console.log(json.__proto__ == Object.prototype) // true
即使這樣,也不能說 json 就是 js 對象,確切的說 js 對象是 json 在 js 語言中的載體。 作為一種跨語言的數(shù)據(jù)格式,它不能像 js 對象一樣添加一個函數(shù)作為屬性,值不能為 NaN 或 undefined。所能傳遞的都是各種語言易解析的數(shù)據(jù)類型。
json 本身只是一種數(shù)據(jù)格式,要想在 js 中使用,就需要依賴語言提供解釋器。也就是說,是 js 的 json 解釋器把 json 數(shù)據(jù)轉(zhuǎn)換成了 js 中易使用的 object 類型。
上面已經(jīng)提到了, js 對象是 json 在 js 語言中的載體,所以在 js 對象沒有函數(shù)屬性與非法值的時候,無需計較它到底是什么。 以下是兩者相互轉(zhuǎn)換的方法:
// 字符串轉(zhuǎn) json
var json = JSON.parse('{ "a": 1}');
// 對象轉(zhuǎn)字符串
var jsonStr = JSON.stringify({ b: 2 });
以上是個人理解,至于你信不信……