2012-01-09 18 views
5

मैं विशेष रूप से map विधि के लिए, Underscore.js पुस्तकालय के लिए स्रोत कोड देख रहा था (उस पृष्ठ पर लाइन 85, और यहाँ की नकल की चारों ओर):नकारात्मक ऑब्जेक्ट लंबाई जावास्क्रिप्ट या underscore.js में संभव है? जिसका अर्थ है?

_.map = function(obj, iterator, context) { 
    var results = []; 
    if (obj == null) return results; 
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 
    each(obj, function(value, index, list) { 
     results[results.length] = iterator.call(context, value, index, list); 
    }); 
    if (obj.length === +obj.length) results.length = obj.length; 
    return results; 
    }; 

पूरी तरह से निम्न पंक्ति

if (obj.length === +obj.length) results.length = obj.length; 
के लिए छोड़कर सीधा

अब, मैंने इसका अर्थ यह है कि "यदि वस्तु की लंबाई ऋणात्मक संख्या नहीं है ..."
, यदि मेरी व्याख्या सही है, तो इसका तात्पर्य है कि यह हो सकता है!

तो, प्रिय विशेषज्ञों, वस्तुओं की क्या प्रकार के लिए

obj.length === +obj.length 

false हो सकता है? === की मेरी समझ का अर्थ है कि यह false वापस कर सकता है यदि obj.length का प्रकार +obj.length के प्रकार से मेल नहीं खाता है, लेकिन यहां मेरा ज्ञान कम हो जाता है। किस प्रकार की चीजें obj.length हो सकती हैं? x === +x किसी प्रकार का सामान्य बेवकूफ परीक्षण है जिसे मैं नहीं जानता? क्या यह किसी विशेष प्रकार के विशेष मामले का जवाब देता है जो underscore.js में गहरा होता है, उदाहरण के लिए, underscore.js कुछ पारंपरिक उद्देश्यों के लिए नकारात्मक ऑब्जेक्ट। लम्बाई असाइन और ट्रैक करता है? मार्गदर्शन और सलाह की सराहना की जाएगी।

+2

ध्यान दें कि 'x x * आवश्यक नहीं * सकारात्मक है - यह केवल 'x' का संख्यात्मक मान है। तो यदि 'var x = -10',' + x' भी '-10' है। –

+0

हां, एहसास करें कि + x ने x के मान में कुछ भी नहीं किया है (इसे तुलना के लिए अस्थायी रूप से बढ़ाया नहीं है)। – grantwparks

उत्तर

4

मुझे लगता है कि यह देखने के लिए परीक्षण अगर typeof obj.length === 'number'

के रूप में अगर यह एक वस्तु '2 days'

की लंबाई महत्व है कि करने के लिए विरोध तो यह जानता है अगर यह की तरह एक वस्तु है:

var obj = { app: 'doctor', length: '45 min' }; 

बनाम

var obj = [ 0, 2, 1]; 
+0

मुझे लगता है - मुझे लगता है। यदि 'obj = {app: 'डॉक्टर', लंबाई: '45 मिनट '}' फिर 'obj.length'' अपरिभाषित' होगा, और '+ obj.Length'' NaN' होगा। लेकिन अगर 'obj' एक सरणी है, तो इसकी लंबाई एक सकारात्मक संख्या होगी और सभी ठीक होंगे। तो यह वास्तव में सरणी-नेस का एक परीक्षण है। अब सवाल यह है कि "क्यों नहीं 'ओआरजे उदाहरण' ऐरे '? –

+0

obj.length को अपरिभाषित नहीं किया जाएगा क्योंकि ओबीजे में एक विशिष्ट लंबाई संपत्ति है और इसका मान '45 मिनट' है। लेकिन इसका उपयोग करना बुरा होगा लंबाई। – grantwparks

3

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

obj.length === +obj.length 

का भी अर्थ हो सकता है: "लंबाई एक संख्या है और स्ट्रिंग नहीं है"।

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