जावास्क्रिप्ट पर डीपक्लोन जिसे ट्वीट किया जा सकता है

शुभ दोपहर

मुझे नहीं पता कि किसी को दिलचस्पी होगी, लेकिन आज मैंने एक ऐसा चमत्कार बनाया है: डीपक्लोन, 140 बाइट्स में crammed।
यदि किसी ने पहले से ही ऐसा किया है और उपवास किया है, तो कृपया अपनी नाक को दबाएं। मुझे ट्वीट प्रारूप में केवल उथली प्रतियां मिलीं। खैर, मैं बाहर नहीं करता कि कुछ लागू हैक निषिद्ध दवाओं की सूची में है , और डरावनी कारें इसके उपयोग पर भरोसा करती हैं :)

कमियों में से, यह jQuery से विस्तार फ़ंक्शन के साथ क्लोनिंग के समान है: यह बूलियन, स्ट्रिंग, तिथि प्रकार की मानक वस्तुओं को नहीं खाती है, प्रोटोटाइप और कंस्ट्रक्टर को अनदेखा करती है, और रिंगों पर लटकाती है।
गरिमा एक है और, अधिकांश भाग के लिए, विशुद्ध रूप से सौंदर्य - आकार।

फ़ायरफ़ॉक्स, क्रोमियम, ओपेरा, IE8 और डिफ़ॉल्ट एंड्रॉइड ब्राउज़र में परीक्षण किया गया।

कटौती के तहत - कोड और एक छोटी कहानी के बारे में कि यह कैसे काम करता है।



शुरुआत के लिए, एक पठनीय संस्करण (जिसे डुप कहा जाता है क्योंकि अन्यथा 140 बाइट संकुचित नहीं होते हैं):
function dup(o) { // "string", number, boolean if(typeof(o) != "object") { return o; } // null if(!o) { return o; // null } var r = (o instanceof Array) ? [] : {}; for(var i in o) { if(o.hasOwnProperty(i)) { r[i] = dup(o[i]); } } return r; } 


यहाँ क्या हो रहा है:

यदि ऑब्जेक्ट सरल है (स्ट्रिंग, संख्या, बूलियन), तो इसे वापस लौटाएं, फिर जांचें कि ऑब्जेक्ट शून्य नहीं है (टाइपऑफ़ (शून्य) भी == "ऑब्जेक्ट")। अब हम परिणाम (सरणी या ऑब्जेक्ट) बनाते हैं और गुणों के माध्यम से चलाते हैं, उन्हें पुनरावर्ती रूप से क्लोन करते हैं।

सामान्य तौर पर, सब कुछ सरल है। अब लगभग 300 बाइट्स को दो बार निचोड़ने की आवश्यकता है।

हम कुछ चीजों को याद करते हैं जो हमारी मदद करेंगे:
- टाइपोफ़ एक ऑपरेटर है, और इसे कोष्ठक की आवश्यकता नहीं है;
- y ?: प्राथमिकता सबसे कम है, इसलिए फिर से बाईं ओर के कोष्ठक छोड़े जा सकते हैं;
- null && {} null है, और obj && {} obj है;
- के लिए (शून्य में var i) त्रुटि के बिना गुजरता है, एक पुनरावृत्ति किए बिना;
- फ़ंक्शन के पैरामीटर भी चर हैं, लेकिन उन सभी को स्थानांतरित करना पूरी तरह से वैकल्पिक है। यह हमें स्पेस के साथ वर्जन शब्द पर 4 बाइट्स बचाने में मदद करेगा।

इसके आधार पर, हमें यह मिलता है:
 function dup(o,i,r) { if(typeof o != "object") return o; r = o instanceof Array ? [] : o&&{}; for(i in o) if(o.hasOwnProperty(i)) r[i] = dup(o[i]); return r } 


ठीक है, या एक पंक्ति में (139 अक्षर):
 function dup(o,i,r){if(typeof o!="object")return o;r=o instanceof Array?[]:o&&{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i]);return r} 

यदि आप अनुमेय आकार को 150 वर्णों तक बढ़ाते हैं, तो आप स्वयं से लिंक का प्रसंस्करण भी जोड़ सकते हैं (छल्ले को पूरी तरह से नहीं तोड़ना, बिल्कुल, लेकिन कम से कम कुछ):
 r[i] = (o[i] === o) ? r : dup(o[i]); 

या:
 function dup(o,i,r){if(typeof o!="object")return o;r=o instanceof Array?[]:o&&{};for(i in o)if(o.hasOwnProperty(i))r[i]=o[i]===o?r:dup(o[i]);return r} 


डेमो: pastehtml.com/view/buikhdvfe.html ( पेस्टशोमर से बिना आवरण के देखने के लिए, "दृश्य" शब्द को "कच्चे" के साथ लिंक में बदलें)

युपीडी:
TheShock के लिए धन्यवाद , फ़ंक्शन अभी भी थोड़ा पतला है!
इसके विकल्प हैं:
 function dup(o,i,r) { r=o; if(r && typeof o == "object") { r = o instanceof Array ? [] : {}; for(i in o) if(o.hasOwnProperty(i)) r[i] = dup(o[i]); } return r } // 135 function dup(o,i,r){r=o;if(r&&typeof o=="object"){r=o instanceof Array?[]:{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i])}return r} //   ie8, 133 : function dup(o,i,r){r=o;if(r&&typeof o=="object"){r=Array.isArray(o)?[]:{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i])}return r} 

एक और बाइट को बचाने के तरीके पर mark_ablov से एक अतिरिक्त प्रस्ताव भी था, यदि:
 o.hasOwnProperty(i)?r[i]=dup(o[i]):1 


UPD 2:
और विचार का अंतिम विकास TheShock से फिर से है:
 function c(o,i,r){if(o&&typeof o=="object"){r=o instanceof Array?[]:{};for(i in o)o.hasOwnProperty(i)?r[i]=o[i]===o?r:c(o[i]):0}return r||o} 

पूरी तरह से शुद्ध win'a के 140 बाइट्स, और IE8 के तहत काम कर रहे हैं, और छल्ले की न्यूनतम जांच के साथ!
हुर्रे, कॉमरेड्स!

Gist : gist.github.com/2369704
अपडेटेड डेमो: pastehtml.com/view/buivcoinzka.html

UPD 3.4: अंतिम हथियार
वास्तविक उपयोग के लिए, मैंने एक और संस्करण बनाया जो एक ट्वीट में फिट नहीं है (इसे हल्के ढंग से डालने के लिए), लेकिन तारीखों और ऑब्जेक्ट रैपर के साथ काम करता है, और किसी भी लूप और आंतरिक लिंक को पूरी तरह से हल करता है। सिंगल-लाइन संस्करण 328 बाइट्स लेता है।
मुझे यह भी एहसास हुआ कि मैं एक दुर्लभ सनकी हूं, क्योंकि मैं मल्टी-फ्रेम और इंस्टोफ़ के साथ समस्याओं के बारे में पूरी तरह से भूल गया था। खैर, मुकाबला संस्करण में, और यह भी अब तय हो गया है।
यहाँ जिस्ट: gist.github.com/0d3e6ce689e76105f3ef
यहां डेमो: pastehtml.com/view/bumpwvs4q.html

Source: https://habr.com/ru/post/In141961/


All Articles