[英]Difference between toJSON() and JSON.Stringify()
如果需要讀取或克隆模型的所有數據屬性,請使用其toJSON()方法。 此方法將屬性的副本作為對象返回(盡管名稱不是JSON字符串)。 (當JSON.stringify()傳遞一個帶有toJSON()方法的對象時,它會將toJSON()的返回值字符串化而不是原始對象。上一節中的示例在調用JSON.stringify時利用了此功能。 ()記錄模型實例。)
http://addyosmani.github.io/backbone-fundamentals/#backbone-basics
任何人都可以告訴我這兩種以JSON
表示法representing an object
方式之間的區別。 我只是困惑這些是否實現相同或存在差異。
從精細手冊 :
toJSON行為
如果要進行字符串化的對象具有名為
toJSON
的屬性,其值為函數,則toJSON
方法自定義JSON字符串化行為:而不是被序列化的對象,調用時toJSON
方法返回的值將被序列化。
這就是Backbone使用toJSON
方法進行序列化並給出一個名為m
的模型實例的原因,你可以說:
var string = JSON.stringify(m);
並獲得m
的屬性,而不是服務器不關心的一堆噪音。
也就是說,主要區別在於toJSON
生成一個值(數字,布爾值,對象,...),它轉換為JSON字符串,而JSON.stringify
總是生成一個字符串。
默認的Backbone toJSON
就是這個(對於模型):
return _.clone(this.attributes);
所以m.toJSON()
為您提供了模型屬性的淺表副本。 如果有數組或對象作為屬性值,那么您將結束意外的參考共享。 請注意, Backbone.Model#clone
也會遇到此問題 。
如果您想安全地克隆模型的數據,那么您可以通過JSON.stringify
和JSON.parse
發送它以獲得深層副本:
var data = JSON.parse(JSON.stringify(model_instance));
var cloned_model = new M(data);
其中model_instance
是Backbone模型M
實例。
JSON.stringify()
- 可以對任何有效的JSON表示值進行字符串化。
JSON.stringify(..)
實用程序會在JSON.stringify(..)
undefined
, function
和symbol
值時自動省略它們。 如果在array
找到這樣的值,則該值將替換為null
(以便不更改數組位置信息)。 如果找到object
屬性,則只會排除該屬性。
JSON字符串化具有以下特殊行為:如果object
值定義了toJSON()
方法,則首先調用此方法以獲取用於序列化的值。
toJSON()
- 到適合字符串化的有效JSON值。
舉個例子, JSON.stringify()
一個帶有循環引用的object
,會拋出一個錯誤。 toJSON()
可以修復如下。
var o = { }; var a = { b: 32, c: o }; // circular reference od = a; // JSON.stringify( a ); // an error caused by circular reference // define toJSON method a.toJSON = function() { return { b: this.b }; }; JSON.stringify( a ); // "{"b":32}"
我也在閱讀Addy Osmani的開發backbone.js應用程序 ,我也有同樣的問題。 我通過在控制台中嘗試他的示例(待辦事項列表)來弄清楚。
var Todo = Backbone.Model.extend({
defaults:{
title:"",
completed:false
}
});
var todo1 = new Todo();
console.log(todo1.toJSON())
//The console shows
//Object {title: "finish your assignment", completed: false}
console.log(JSON.stringify(todo1))
//The console shows
//{"title":"finish your assignment","completed":false}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.