javascript - Null या अपरिभाषित मूल्यों के साथ जावास्क्रिप्ट स्ट्रिंग संगति व्यवहार




undefined string-concatenation (4)

जैसा कि आप जानते हैं, जावास्क्रिप्ट में '' + null = "null" और '' + undefined = "undefined" (अधिकांश ब्राउज़रों में मैं परीक्षण कर सकता हूं: फ़ायरफ़ॉक्स, क्रोम और आईई)। मैं इस विषमता की उत्पत्ति जानना चाहता हूं (ब्रेंडन ईच पर सिर क्या था?) और अगर ईसीएमए के भविष्य के संस्करण में इसे बदलने का कोई उद्देश्य है। यह वास्तव में बहुत निराशाजनक है 'sthg' + (var || '') लिए चर के साथ 'sthg' + (var || '') लिए और अंडरस्कोर या अन्य जैसे किसी तीसरे पक्ष के ढांचे का उपयोग करने के लिए जेली नेल पाउंडिंग के लिए एक हथौड़ा का उपयोग कर रहा है।

संपादित करें:

StackOverflow द्वारा आवश्यक मानदंडों को पूरा करने और मेरे प्रश्न को स्पष्ट करने के लिए, यह एक तीन गुना है:

  • उस विषमता के पीछे का इतिहास क्या है जो जेएस को null या undefined उनके स्ट्रिंग मान को String संघनन में परिवर्तित करता है?
  • क्या भविष्य के ECMAScript संस्करणों में इस व्यवहार में बदलाव का कोई मौका है?
  • इस समस्या में गिरने के बिना संभावित null या undefined वस्तु के साथ String को छिपाने का सबसे सुंदर तरीका क्या है (स्ट्रिंग के बीच में "null" कुछ "undefined" )? व्यक्तिपरक मानदंड से, मेरा मतलब है: लघु, स्वच्छ और प्रभावी। कहने की ज़रूरत नहीं है कि '' + (obj ? obj : '') वास्तव में सुंदर नहीं है ...

इस समस्या में पड़ने के बिना संभावित अशक्त या अपरिभाषित वस्तु के साथ स्ट्रिंग को छिपाने का सबसे सुंदर तरीका क्या है [...]?

कई तरीके हैं, और आपने आंशिक रूप से उन्हें खुद का उल्लेख किया है। इसे छोटा करने के लिए, मैं केवल एक ही स्वच्छ तरीका सोच सकता हूं:

const Strings = {};
Strings.orEmpty = function( entity ) {
    return entity || "";
};

// usage
const message = "This is a " + Strings.orEmpty( test );

बेशक, आप अपनी आवश्यकताओं के अनुरूप वास्तविक कार्यान्वयन को बदल सकते हैं (और करना चाहिए)। और यह पहले से ही है इसलिए मुझे लगता है कि यह विधि श्रेष्ठ है: इसने एनकैप्सुलेशन की शुरुआत की।

वास्तव में, आपको केवल पूछना होगा कि "सबसे सुंदर" तरीका क्या है, अगर आपके पास एनकैप्सुलेशन नहीं है। आप अपने आप से यह सवाल पूछते हैं क्योंकि आप पहले से ही जानते हैं कि आप अपने आप को एक ऐसी जगह पर ले जा रहे हैं जहाँ आप कार्यान्वयन को अब और नहीं बदल सकते हैं, इसलिए आप चाहते हैं कि यह एकदम सही हो। लेकिन यह बात है: आवश्यकताओं, विचारों और यहां तक ​​कि ऊर्जा में परिवर्तन। वे विकसित होते हैं। तो क्यों न खुद को एक पंक्ति और शायद एक या दो परीक्षणों को अपनाने के साथ कार्यान्वयन को बदलने की अनुमति दें?

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

यदि, आपके कोड में, आप दोहराते रहते हैं || इनलाइन, आप दो समस्याओं में भाग लेते हैं:

  • आप डुप्लिकेट कोड।
  • और क्योंकि आप कोड को डुप्लिकेट करते हैं, आप भविष्य में बनाए रखने और बदलने के लिए इसे कठिन बनाते हैं।

और ये दो बिंदु हैं जिन्हें आमतौर पर उच्च-गुणवत्ता वाले सॉफ़्टवेयर विकास के लिए एंटी-पैटर्न के रूप में जाना जाता है।

कुछ लोग कहेंगे कि यह बहुत अधिक उपरि है; वे प्रदर्शन के बारे में बात करेंगे। यह बकवास है। एक के लिए, यह बमुश्किल ओवरहेड जोड़ता है। यदि यह वह है जिसके बारे में आप चिंतित हैं, तो आपने गलत भाषा को चुना। यहां तक ​​कि jQuery के कार्यों का उपयोग करता है। लोगों को माइक्रो-ऑप्टिमाइजेशन पर काबू पाने की जरूरत है।

दूसरी बात यह है: आप एक कोड "कंपाइलर" = मिनीफ़ायर का उपयोग कर सकते हैं। इस क्षेत्र में अच्छे उपकरण यह पता लगाने की कोशिश करेंगे कि संकलन चरण के दौरान कौन से कथन इनलाइन हैं। इस तरह, आप अपने कोड को साफ और रख-रखाव करते हैं और यदि आप अभी भी इस पर विश्वास करते हैं या वास्तव में ऐसा वातावरण है जहां यह मायने रखता है, तो प्रदर्शन की आखिरी बूंद मिल सकती है।

अन्त में, ब्राउज़रों में कुछ विश्वास रखें। वे कोड का अनुकूलन करेंगे और वे इन दिनों इस पर बहुत अच्छा काम करते हैं।


क्या भविष्य के ECMAScript संस्करणों में इस व्यवहार में बदलाव का कोई मौका है?

मैं कहूंगा कि संभावना बहुत पतली है। और कई कारण हैं:

हम पहले से ही जानते हैं कि ईएस 5 और ईएस 6 क्या दिखते हैं

भविष्य के ईएस संस्करण पहले से ही किए गए हैं या मसौदे में हैं। न तो एक, अफाक, इस व्यवहार को बदल देता है। और यहाँ ध्यान रखने वाली बात यह है कि इन मानकों को ब्राउज़रों में इस अर्थ में स्थापित करने में कई साल लगेंगे कि आप इन मानकों के साथ उन अनुप्रयोगों को लिख सकते हैं जो प्रॉक्सी टूल्स पर निर्भर किए बिना इसे वास्तविक जावास्क्रिप्ट पर संकलित करते हैं।

बस अवधि का अनुमान लगाने की कोशिश करें। ES5 भी पूरी तरह से वहाँ से बाहर के अधिकांश ब्राउज़रों द्वारा समर्थित नहीं है और इसमें शायद कुछ और साल लगेंगे। ES6 अभी तक पूरी तरह से निर्दिष्ट नहीं है। नीले रंग से, हम कम से कम पांच साल देख रहे हैं।

ब्राउजर अपनी चीजें खुद करते हैं

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

और ब्राउज़र विशेष रूप से यहाँ अपना निर्णय ले सकते हैं क्योंकि:

यह बदलाव टूट रहा है

मानकों के बारे में सबसे बड़ी चीजों में से एक यह है कि वे आमतौर पर पीछे की ओर संगत होने की कोशिश करते हैं। यह वेब के लिए विशेष रूप से सच है जहां एक ही कोड को सभी प्रकार के वातावरण पर चलना होता है।

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

निश्चित रूप से, इस विशेष परिवर्तन से बहुत सी लिपियों के टूटने की संभावना नहीं है। लेकिन यह आमतौर पर एक गरीब तर्क है क्योंकि एक मानक सार्वभौमिक है और हर मौके को ध्यान में रखना है। जरा विचार करें

"use strict";

सख्त मोड पर स्विच करने के निर्देश के रूप में। यह दिखाने के लिए जाता है कि एक मानक जो सब कुछ को संगत बनाने की कोशिश में लगा है, क्योंकि वे सख्त मोड को डिफ़ॉल्ट बना सकते हैं (और यहां तक ​​कि अन्य मोड)। लेकिन इस चतुर निर्देश के साथ, आप पुराने कोड को बिना परिवर्तन के चलने दे सकते हैं और फिर भी नए, सख्त मोड का लाभ उठा सकते हैं।

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

और संगतता को तोड़ने के लिए एक मानक के लिए, एक बहुत अच्छा कारण होना चाहिए। जो हमें लाता है

कोई अच्छा कारण नहीं है

हाँ, यह तुम्हें कीड़े। उस समझ में आने योग्य है। लेकिन आखिरकार, यह कुछ भी नहीं है जिसे बहुत आसानी से हल नहीं किया जा सकता है। उपयोग करें || एक समारोह लिखें - जो भी हो। आप इसे लगभग किसी भी कीमत पर काम कर सकते हैं। तो क्या वास्तव में इस परिवर्तन के विश्लेषण में हर समय और प्रयास करने के लिए लाभ है जो हम जानते हैं कि वैसे भी टूट रहा है? मैं अभी बात नहीं देख रहा हूँ।

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

अस्वीकरण: यह उत्तर आंशिक रूप से राय आधारित है।


अशक्त और '' को जोड़ने के लिए उन्हें न्यूनतम सामान्य प्रकार के मानदंड को पूरा करने की आवश्यकता होती है जो इस मामले में एक स्ट्रिंग प्रकार है।

null को इस कारण "null" में बदल दिया जाता है और जैसे वे स्ट्रिंग करते हैं, दोनों को समेट लिया जाता है।

संख्याओं के साथ भी यही होता है:

4 + '' = '4'

जैसा कि वहाँ एक स्ट्रिंग है जिसे किसी भी संख्या में परिवर्तित नहीं किया जा सकता है, इसलिए 4 को इसके बजाय स्ट्रिंग में बदल दिया जाएगा।


undefined और null अनदेखी करने के लिए आप Array.prototype.join का उपयोग कर सकते हैं:

['a', 'b', void 0, null, 6].join(''); // 'ab6'

spec अनुसार:

यदि तत्व undefined या null , तो अगले को खाली स्ट्रिंग होने दें; अन्यथा, आगे ToString ( तत्व ) होने दें।

मान लीजिये,

  • उस विषमता के पीछे का इतिहास क्या है जो जेएस को null या undefined उनके स्ट्रिंग मान को String संघनन में परिवर्तित करता है?

    वास्तव में, कुछ मामलों में, वर्तमान व्यवहार समझ में आता है।

    function showSum(a,b) {
        alert(a + ' + ' + b + ' = ' + (+a + +b));
    }

    उदाहरण के लिए, यदि ऊपर दिए गए फ़ंक्शन को तर्कों के बिना कहा जाता है, तो undefined + undefined = NaN संभवतः + = NaN से बेहतर है।

    सामान्य तौर पर, मुझे लगता है कि यदि आप एक स्ट्रिंग में कुछ चर डालना चाहते हैं, तो undefined या null दिखाना समझ में आता है। शायद, ईच ने भी यही सोचा।

    बेशक, ऐसे मामले हैं जिनमें अनदेखी करना बेहतर होगा, जैसे कि तार को एक साथ जोड़ते समय। लेकिन उन मामलों के लिए आप Array.prototype.join उपयोग कर सकते हैं।

  • क्या भविष्य के ECMAScript संस्करणों में इस व्यवहार में बदलाव का कोई मौका है?

    न होने की सम्भावना अधिक।

    चूँकि पहले से ही Array.prototype.join , Array.prototype.join स्ट्रिंग के Array.prototype.join के व्यवहार को संशोधित करने से केवल नुकसान ही होगा, लेकिन इसके कोई फायदे नहीं हैं। इसके अलावा, यह पुराने कोड तोड़ देगा, इसलिए यह पीछे की ओर संगत नहीं होगा।

  • संभावित null या undefined साथ स्ट्रिंग को संक्षिप्त करने का सबसे सुंदर तरीका क्या है?

    Array.prototype.join सबसे सरल प्रतीत होता है। चाहे वह सबसे सुंदर हो या नहीं, राय आधारित हो सकती है।






string-concatenation