2011-11-14 18 views
6

मैं चारों ओर जावास्क्रिप्ट में सच्चाई तालिकाओं के साथ खिलवाड़ कर रहा था, मैंने देखा है कि निम्नलिखित सही का आकलन:{} <function() {} क्यों है?

var a, b, c; 
a = {}; 
b = function(){}; 
c = a < b; 
console.log(c); 

क्यों?

मैं केवल फ़ायरफ़ॉक्स में इस परीक्षण किया है, और मुझे यकीन है कि मैं ECMAScript 2.6.2 कल्पना में विवरण की खुदाई कर सकता हूँ, लेकिन TBH मैं आलसी महसूस कर रहा हूँ।

+1

यह है अधिक हो जाएगा क्रोम में भी सच है। – jer

+0

ऐसा लगता है कि यह केवल वस्तुओं के पते की तुलना कर सकता है। यदि आप संस्थाओं 'ए' और 'बी' की प्रकृति के बारे में आत्मविश्वास से तर्क कर सकते हैं, तो आपको शायद यह डरावना नहीं मिलेगा ... हालांकि मैं निश्चित रूप से नहीं कर सकता :-) –

+1

डाउनवॉटर पर टिप्पणी करने की देखभाल? – zzzzBov

उत्तर

17

जावास्क्रिप्ट प्रकार बलात्कार तुलना अनिवार्य रूप से

String({}) < String(function(){}) 

तो अनिवार्य रूप से आप सिर्फ

"[object Object]" < "function(){}" 

कर रहे हैं जो एक कोषगत स्ट्रिंग तुलना है बनाता है।

+5

देखें [ईसीएमए -262] (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf), सेक्शन 11.8.5 – NullUserException

+4

या [यह 11.8.5] (http: //es5.github.com/#x11.8.5) यदि आप पीडीएफ से गुजरना नहीं चाहते हैं। –

8

valueOf() या toString() पर कॉल करके जावास्क्रिप्ट compares objects
चूंकि न तो ऑपरेंड में valueOf() विधि है, यह toString() एस की तुलना करेगा।

({}).toString()[object Object] है।
(function() { }).toString()function() { } है।

[f से कम है।

4
alert(({}))   -> [object Object] 
alert((function(){})) -> function() {} 

[, इसलिए ({}) < (function() {})f पहले आता है।

हाँ, यह मूर्खतापूर्ण है। ;)

0

बहुत सरल और आसान (आंतरिक रूप से वे दोनों तार में बदल दिए जाते) इस वजह से जावास्क्रिप्ट में

एक वस्तु एक नंबर या तार के साथ तुलना की जाती है, तो जावास्क्रिप्ट के लिए डिफ़ॉल्ट मान वापस करने का प्रयास वस्तु। ऑपरेटर ऑब्जेक्ट के valueOf और toString विधियों का उपयोग करके ऑब्जेक्ट को एक आदिम मान, स्ट्रिंग या संख्या मान में परिवर्तित करने का प्रयास करते हैं।

इसलिए जब दोनों की तुलना की जाती दोनों वस्तुओं आंतरिक ToString विधि का उपयोग कर स्ट्रिंग में बदल दिए जाते

a.toString() 
"[object Object]" 

b.toString() 
"function() { }" 

इसलिए ख एक (बड़ा स्ट्रिंग) से कि है क्यों b> एक सच्चे

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