2015-06-21 10 views
71

D3.js के स्रोत को पढ़ने पर मैंने x >= x पैटर्न देखा। यदि यह संख्याओं के बीच NaNs का पता लगाने के लिए है, तो क्यों न केवल isNaN(x) या x == x क्यों?x> = जावा पैटर्न में x पैटर्न

Source, where I encountered it:

d3.min = function(array, f) { 
    var i = -1, n = array.length, a, b; 
    if (arguments.length === 1) { 
    while (++i < n) if ((b = array[i]) != null && b >= b) { 
     a = b; 
     break; 
    } 
    while (++i < n) if ((b = array[i]) != null && a > b) a = b; 
    } else { 
    while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) { 
     a = b; 
     break; 
    } 
    while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; 
    } 
    return a; 
}; 
+14

प्रतिबद्ध है कि तर्क पेश किया पर एक नज़र डालें: https://github.com/mbostock/d3/commit/d8c8b5ddd6d433b7c80bc5e3e469fdf277c1aa16, https://github.com/mbostock/d3/commit/aad1b18865f8c73c4267c7505435070f42fa6c40 –

+0

@FelixKling धन्यवाद! मैं वास्तव में कुछ एनोटेटेड स्रोत कोड की तलाश में था, लेकिन ऐसा लगता है कि कोई नहीं है: [d3.js स्रोत कोड की एनोटेटेड प्रति jQuery की तरह एक?) (Http://stackoverflow.com/questions/10624927/annotated-copy- of-d3-js-source-code-like-the-one-for-jquery) –

उत्तर

79

मेरी जांच से, d3.min किसी भी प्रकार के ऑर्डर करने योग्य मूल्यों पर काम नहीं करना चाहिए, न केवल संख्याएं। isNaN केवल संख्याओं को काम करेगा।

डी 3 वास्तव में किसी बिंदु पर == का उपयोग कर रहा था। This commitx == x परीक्षण शुरू की:

Math.min और Math.max के विपरीत, यह मतलब नहीं है d3.min और d3.max के लिए नकारात्मक या सकारात्मक अनंत वापस जाने के लिए; डी 3 फ़ंक्शंस संख्यात्मक मान के अनुसार न्यूनतम मान वापस करता है, न कि संख्यात्मक मूल्य से। इसके बजाए, न्यूनतम या अधिकतम खाली सरणी, या एक सरणी जिसमें केवल अपरिवर्तनीय मान होते हैं, हमेशा अनिर्धारित होना चाहिए।

This commitx <= x को x == x बदल (जो बाद में पुन: x >= x में बदल गया था): की वजह से परिभाषित

NaN है, जो खुद के बराबर नहीं है के अलावा, आप वस्तुओं है कि orderable नहीं हैं हो सकता है मूल्य जो कार्य नाओ वापस करता है। उदाहरण के लिए:

var o = new Number(NaN); 

यहाँ, o == o सही है, लेकिन o <= o गलत है। इसलिए डी 3.min, d3.max और d3.extent के लिए यह संभव था कि इन गैर-क्रमिक मानों को ध्यान में रखते हुए उन्हें अनदेखा करने के बजाय। o == o की बजाय !(o <= o) जांचना ठीक है।

+45

+1 संयोग से, '! (ओ <= ओ)' मेरा चेहरा तब दिखता है जब मैं जावास्क्रिप्ट के '==' समानता नियमों को समझने की कोशिश कर रहा हूं। – user568458

8

ठीक है, मुझे लगता है कि x >= xNaN और undefined दोनों के लिए false देता है। (isNaN(x) या x == x के विपरीत।)

संपादित करें: हालांकि यह इस मामले (इस ओर इशारा करते हुए के लिए THX @Felix Kling) में x >= x के उपयोग के मामलों में से एक है, undefined पहले ही जाँच की जा रही है।

+5

हालांकि, 'अपरिभाषित' केस पहले से ही '! = null' के साथ कवर किया गया है। –

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