2015-06-21 5 views
17

मैं बस jQuery के कोड से जा रहा था और फ़ंक्शन विलय में आया था। मैं इस समारोह के कोड की जाँच की:jQuery मर्ज फ़ंक्शन में स्थिति अगर परेशान हो रहा है

merge: function(first, second) { 
    var len = +second.length, 
     j = 0, 
     i = first.length; 

    while (j < len) { 
     first[ i++ ] = second[ j++ ]; 
    } 

    // Support: IE<9 
    // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) 

    if (len !== len) { 
     while (second[j] !== undefined) { 
      first[ i++ ] = second[ j++ ]; 
     } 
    } 

    first.length = i; 

    return first; 
}, 

अब अगर आप कोड के माध्यम से जाना, आप निम्न if जांच भर में आ जाएगा:

if (len !== len) 

यह किसी भी तरह से मेरे लिए कोई मतलब नहीं है, यह जांच वास्तव में क्या है, और यह क्या कर रहा है? तो क्यों किसी को अगर len !== len की जाँच करेगा

var len = +second.length; 

:

len स्पष्ट रूप से तो जैसे ऊपर कुछ पंक्तियां परिभाषित किया गया है,? यह किसी भी तरह से मुझे समझ में नहीं आता है। क्या कोई समझा सकता है?

+3

यह समझदार नहीं दिखता है लेकिन जाहिर है 'NaN! == NaN // true'। मुझसे मत पूछो क्यों ... 'isNaN (लेन) 'मेरे लिए अधिक तार्किक लग रहा है। – Jonathan

+1

@ जोनाथन एनएएनएन 'नंबर नहीं' (स्ट्रिंग, बूलियन ...) के लिए चेक करें, 'लेन! == लेन' 'NaN' मान – Hacketo

+0

के लिए चेक करें, अंतर को इंगित करने के लिए धन्यवाद। मैं सोच रहा हूं कि 'NaN! == NaN' जेएस में सबसे ज्यादा wtf है जिसे मैंने कभी देखा है। – Jonathan

उत्तर

15

यह NaN के लिए एक चेक है (जैसा कि @ जोनाथन की टिप्पणी में सही ढंग से बताया गया है)। उत्कृष्ट Mozilla documentation से:

NaN असमान तुलना (के माध्यम से ==, =, ===, और ==!) किसी भी अन्य मूल्य के लिए - एक और NaN मूल्य के लिए भी शामिल है। Number.isNaN() या isNaN() का उपयोग सबसे स्पष्ट रूप से निर्धारित करने के लिए करें कि कोई मान NaN है या नहीं। या एक आत्म-तुलना करें: NaN, और केवल NaN, इसकी तुलना असमान से की जाएगी।

+0

भले ही, यह अधिक पठनीय कोड लिखने का एक भयानक तरीका है। – Alp

+0

यह काफी आम जेएस मुहावरे है, लेकिन आप सही हैं - यह अजीब है जो गैर-जेएस देवताओं की तलाश में है। मुझे लगता है कि jQuery स्निपेट में रेखा से पहले की टिप्पणी में कुछ पठनीयता चिंता भी कम हो गई है। – Andbdrew

4

काम एक संख्या में आंतरिक रूप से बुला valueOf() और toString() द्वारा मूल्य second.length कन्वर्ट करने के लिए कोशिश करता है var len = +second.length; में + ऑपरेटर (unary plus)। यदि किसी संख्या में रूपांतरण विफल रहता है, तो यह NaN को परिवर्तनीय len पर असाइन करेगा। जैसा कि पहले बताया गया था, len !== lenNaN की जांच करने का एक तरीका है।

+0

'आंतरिक रूप से मूल्य को कॉल करके() और toString() 'क्या आपका मतलब है [यूनरी प्लस (+)] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators #Unary_plus)? – Jonathan

+0

हां। मैंने यूनरी प्लस ऑपरेटर के दस्तावेज़ीकरण के लिंक के साथ अपना जवाब अपडेट किया। –

+0

लेकिन आप यह कैसे मानते हैं कि "कॉलिंग valueOf() और toString()" है? – Jonathan

संबंधित मुद्दे