JSON.stringify के साथ eval संदर्भ में स्ट्रिंग से बच

Nov 13 2020

सबसे पहले: मुझे पता है कि भागने से संबंधित कई सवाल हैं, लेकिन मुझे अब तक आम तौर पर काम करने का जवाब नहीं मिला। कहो कि मेरे पास प्रदर्शन के लिए यह सरल खिलौना कार्य है:

function f(somePOJO) {
  var s = eval("'" + JSON.stringify(somePOJO) + "';"); // for demonstration only
  return JSON.parse(s);
}
const clone = f({a: 1, b: "c"});

एक वस्तु शाब्दिक जैसे {a: 1, b: "c"}(एक POJO) को देखते हुए , fइसे "क्लोन" वापस करना चाहिए। (ध्यान दें कि मैं वास्तव में क्लोनिंग या समान के लिए इस दृष्टिकोण का उपयोग नहीं करता हूं, और मुझे पता है कि evalयह बुराई है और यह भी कि यहां इसकी आवश्यकता भी नहीं है, यह सिर्फ भागने की समस्या के प्रदर्शन के लिए है!)

यह ठीक काम करता है, लेकिन जब तक पीओजेओ मूल्यों में ए शामिल नहीं होता है '। अब मैं निश्चित रूप से कुछ का उपयोग करके JSON से बच सकता है JSON.stringify(somePOJO).replace(/'/g, "\\'")। यह तब काम करता है जब POJO मान सम्‍मिलित है ', लेकिन यदि वे सम्‍मिलित नहीं हैं \\'। और यह भागने का एक सर्पिल बनाता है ...

क्या इसका कोई हल है?

जवाब

1 traktor Nov 13 2020 at 14:01

फ़ंक्शन द्वारा मूल्यांकन किए जा रहे JSON स्ट्रिंग को संरक्षित करने के लिए एस्केप फ़ंक्शन eval, कुछ परिस्थितियों में या JSON.parseफ़ंक्शन द्वारा जावास्क्रिप्ट कंपाइलर वास्तव में है JSON.stringify। यह JSONविधि केवल डेटा प्रकारों को ही नहीं बल्कि स्ट्रिंग मानों को भी खुशी से बढ़ाएगी।

function f(somePOJO) {
  var s = eval( JSON.stringify(JSON.stringify(somePOJO)) );
  return JSON.parse(s);
}
const obj = {a: 1, b: "c", d: "back\\, forward/"}
const clone = f(obj);
console.log(obj);
console.log(clone);

कारण यह नहीं escape/encodeURI/encodeURIComponentहै कि यह फ़ंक्शन के परिवार में से एक है, ये URL में शामिल किए जाने के लिए वर्णों से बचने के लिए हैं, जबकि यह मामला JavaScipt parser द्वारा पार्स किए जाने वाले वर्णों से बचने के बारे में है।

ज्यादातर मामलों में, विशेष रूप से JSON पाठ को पार्स करने के लिए JSON.parse, JSON पाठ को दूसरी बार स्ट्रिंग करना और दो बार पार्स करना केवल अनावश्यक है।

अब कुछ हद तक शैक्षिक रुचि की, लेकिन JSONजावास्क्रिप्ट में पेश करने से पहले , कोई अपने पात्रों का निरीक्षण करके और बैकस्लैश से बचने वाले बैकलैश, कम से कम एक प्रकार के उद्धरण चिह्नों, और यूनिकोड भागने वाले नियंत्रण कोडों का निरीक्षण करके एक तार को कड़ा कर सकता है - पोस्ट किए गए प्रश्न का हिस्सा गायब हो सकता है। बैकस्लैश पात्रों के साथ-साथ उद्धरण चिह्नों से बचने की आवश्यकता के बारे में।