我需要聲明兩個具有相同值的變量,實際上是一個解析的json。他們不應該提到同一個對象。定義兩個變量具有相同的值
有沒有更好的方式來做到這一點比同值分別聲明變量,即
var a = JSON.parse(myJson),
b = JSON.parse(myJson);
我需要聲明兩個具有相同值的變量,實際上是一個解析的json。他們不應該提到同一個對象。定義兩個變量具有相同的值
有沒有更好的方式來做到這一點比同值分別聲明變量,即
var a = JSON.parse(myJson),
b = JSON.parse(myJson);
要將JSON文本轉換成一個對象,你可以使用eval()函數 。 eval函數非常快。但是,它可以編譯和執行任何JavaScript程序,所以可能存在安全問題。爲了防禦它,應該使用JSON解析器。 (link)
如果你看一下JSON.parse(由Doughlas克羅克福德),它主要準備的eval的字符串。所以你可以保存準備好的字符串&使用eval就可以了。
JSON.prepare = function(text) {
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
cx.lastIndex = 0;
if (cx.test(text)) {
text = text.replace(cx, function (a) {
return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
});
}
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
return '(' + text + ')';
}
};
,並用它作爲:
myJson = JSON.prepare(myJson);
var a = eval(myJson),
b = eval(myJson);
這可能是做的最好的事情,因爲深拷貝可能會產生問題和分析是非常快的,除非JSON是巨大的(在這種情況下,深拷貝會當然也慢)。 (其實我猜JSON的一個剛剛解析過的blob的深層副本不會遇到任何像循環一樣複雜的問題,但我仍然只需解析兩次。) – Pointy
您可能想要查看克隆JavaScript對象:http:// stackoverflow .com/questions/728360 /最優雅的方式克隆一個JavaScript對象 – Frithjof
@Pointy謝謝,我試圖避免所有這種重複sice我必須做超過10個變量......但如果這是更好的方法,我會堅持下去 – marcosh