2016-07-29 10 views
12

का मूल्यांकन मैं liketo पता होगा क्यों शीर्षक[] ==! [] सच

[] == ![]

में दिए गए अभिव्यक्ति सच करने के लिए मूल्यांकन किया जाता है।

आप स्ट्रिंग के रूप में सरणी की तुलना नहीं कर सकते हैं। मै समझ गया। क्योंकि संदर्भ भिन्न हैं, तो

[] == []

गलत पर मूल्यांकन करेंगे। हालांकि अगर हमारे पास निम्नलिखित कथन है।

var arr = []; 
arr == arr // this evaluates to true simply because references are the same. 

क्रम में ए == बी सच होने के लिए या तो ए और बी को झूठा या सत्य होना चाहिए। ए ==! बी सही लौटने के लिए बी सही हो सकता है और बी गलत हो सकता है या इसके विपरीत लेकिन इस मामले में ए और बी एक ही मूल्य हैं इसलिए मुझे यह नहीं मिलता है।

+6

इस प्रश्न के साथ कुछ भी गलत नहीं है। यह डाउनवॉट्स के लायक नहीं है। यदि आप असहमत हैं, तो आपको स्पष्टीकरण के साथ एक टिप्पणी छोड़नी चाहिए। – Brad

+0

शायद टिम ने फिर से अपनी चाबियाँ गिरा दीं? – Li357

+0

मेरे पास कोई विचार नहीं है कि कोई भी इसे क्यों कम करेगा। यह बहुत स्पष्ट नहीं है। ब्रैड के बयान में +1 – Tek

उत्तर

4

![]false का मूल्यांकन करता है क्योंकि संदर्भ सत्य है। [] को किसी संख्या में परिवर्तित किया जा सकता है (इस मामले में 0) जो गलत है। इसलिए: स्थिति बराबर गुजरती है। यदि आपने === किया तो यह गलत होगा।

+2

'[]' गलत नहीं है। '[]' एक वस्तु है। इसे अपने ब्राउज़र में आज़माएं: 'अगर ([]) console.log (' झूठी नहीं ') ' –

+1

यह उत्तर गलत है। – Brad

+2

मुझे पूरा यकीन है [यह एक संख्या में परिवर्तित होता है, एक स्ट्रिंग नहीं] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)। – Quentin

-1

एक ऐरे जावास्क्रिप्ट में एक विशेष वस्तु है जिसे कस्टम ऑब्जेक्ट्स से तुलना की जा सकती है। यहां तक ​​कि यह प्रकार वस्तुओं है, [] उदाहरण Array == सत्य;

इसलिए var x = [] का उपयोग करना; एक ऐरे नियंत्रक को कॉल करने से काफी समान है। और जावास्क्रिप्ट में ऑब्जेक्ट्स के दो उदाहरणों की तुलना झूठी वापसी होगी, क्योंकि वे समान स्मृति पता साझा नहीं करते हैं। यह एक सूचक तुलना की तरह है।

+0

प्रश्न दो सरणी की तुलना करने के बारे में नहीं पूछ रहा है। यह एक बूलियन के लिए एक सरणी की तुलना करने के बारे में है। – Quentin

+0

uups .. मेरी गलती – Wolfgang

6

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

तो

=> []==![] 

=> []==false // Type conversion by the statement itself 

=> []==0 // To number of right operand 

=> ""==0 // To Primitive call for Array which will in this case convert to empty string 

=> 0==0 // To number call of "" which is 0 

=> true 

एक संकलक विवरण में यहाँ ECMAScript विवरण के लिए जाँच कर सकते हैं हो सकता है की कोशिश करता है http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1

codementor.io

क्या हो रहा है यह समझने से पहले, हमें जावास्क्रिप्ट में सच्चाई और झूठी अवधारणा को समझने की आवश्यकता है और कैसे! (तार्किक नहीं) ऑपरेटर काम करता है। false, null, undefined, NaN, 0, '' and "" जैसे मानों को गलत माना जाता है। *true, {}, [], "foo" * आदि जैसे अन्य मान सत्य मानते हैं। द! ऑपरेटर, दूसरी ओर, केवल बुलियन मूल्यों के लिए परिभाषित किया गया है। किसी भी अन्य डेटा प्रकार को स्वचालित रूप से इसके संबंधित बूलियन मान में ले जाया जाएगा जब संचालित होता है! ऑपरेटर। यहां, ![] झूठे का मूल्यांकन करता है और तुलना वास्तव में '[] == false' बन जाती है जो 'true' का मूल्यांकन करती है। क्या यह गलत नहीं होना चाहिए, क्योंकि खाली सरणी सच हैं? यह सही है लेकिन डबल बराबर ऑपरेटर कुछ नियमों पर अभिव्यक्तियों का मूल्यांकन करता है। हम एक ऑब्जेक्ट की तुलना एक बूलियन वैल्यू के साथ करने की कोशिश कर रहे हैं और जावास्क्रिप्ट ऑपरेशंस को संख्या प्रकार में रूपांतरित कर देगा।Number([]) is 0 और Number(false) is also 0, जब भी 2 मूल्यों == का उपयोग कर तुलना की जाती है जो true since zero is equal to zero

1

को मूल्यांकन करता है, जावास्क्रिप्ट सार समानता तुलना एल्गोरिथ्म प्रदर्शन करती है।

enter image description here

यहाँ, एक्स [] [] है, और y है!।

हैं प्रकार (वाई) बूलियन है, की तुलना एक्स परिणाम लौट: इसके अलावा,

typeof([]) // "object" 
typeof(![]) // "boolean" 

के बाद से y एक बूलियन है और x एक वस्तु है, हालत 7 धारण करने के लिए पहले है == टूनंबर (वाई)।

ToNumber (y) का क्या महत्व है?

Number(![]) // 0 

क्योंकि [] एक सच्चा मूल्य है, नकारात्मक इसे झूठा बनाता है। [] == 0.

के बाद से typeof (0) "संख्या", हालत 8 अब रखती है:

हैं प्रकार (संख्या (गलत) 0

अब हम तुलना है एक्स) ऑब्जेक्ट और टाइप (वाई) या तो स्ट्रिंग या नंबर है, तुलना तुलना करने के परिणाम ToPrimitive (x) == y।

ToPrimitve (x) x.toString() की तरह है।

[].toString() // ”” - the empty string 

लगभग हो गया अब हम तुलना के साथ आमने: "" == 0

अब, हालत 5 रखती है:

हैं प्रकार (x) है स्ट्रिंग और प्रकार (वाई) है संख्या, तुलना टूनंबर (x) == y के परिणाम लौटाएं।

ToNumber(“”) // 0 

अंत में दोनों ऑपरेंड एक ही प्रकार और हालत 1 रखती है। मुझे लगता है कि आप यहां से ले सकते हैं :)

चश्मे पर Abstract Equality Comparison के बारे में पढ़ें!

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