2011-07-26 17 views
9

जावास्क्रिप्ट undefined में पुन: असाइन किया जा सकता है, इसलिए अक्सर यह एक स्वयं निष्पादन कार्य बनाने की सलाह दी जाती है जो अनिर्धारित आश्वासन देता है वास्तव में अनिर्धारित है। एक वैकल्पिक null और undefined निश्चित रूप से == हैं, लेकिन क्या कोई अन्य मान null/undefined के बराबर समतुल्य है?जावास्क्रिप्ट अपरिभाषित शून्य के साथ प्रतिस्थापित

(function(undefined){ 

    window.f = function(obj){ 
    if(obj===undefined || obj===null){ 
     alert('value is undefined or null'); 
    } 
    } 

})(); 

साथ:

TLDR

मूल रूप से आप सुरक्षित रूप से इस जगह ले सकता है

window.f = function(obj){ 
    if(obj==null){ 
    alert('value is undefined or null'); 
    } 
} 

यदि उपरोक्त 100% सुरक्षित है, क्यों जावास्क्रिप्ट समुदाय/पुस्तकालयों ड्रॉप नहीं है undefined पूरी तरह से और कम से कम x == null सशर्त का उपयोग null/undefined दोनों को एक बार में जांचने के लिए करें?

संपादित करें:

मैं कभी नहीं देखा है किसी को वास्तव में साथ बनाम null 'अनिर्धारित' एक "अज्ञात मूल्य" का प्रतिनिधित्व? मैंने कभी इस परिदृश्य को नहीं देखा है, और इसलिए मैंने मूल रूप से सवाल पूछा। यह सिर्फ दो अविश्वसनीय रूप से भ्रमित मूल्य प्रतीत होता है जिनका उपयोग कभी भी उनके मूल उद्देश्य में नहीं किया जाता है। तुलना करने के लिए सब कुछ मानकीकृत obj==null आकार के लिए फायदेमंद होगा और पुन: असाइनमेंट के साथ किसी भी मुद्दे से बचें। सब कुछ

var obj={}; 
obj.nonExistantProperty==null // true 

var x; 
ix==null // true 

function(obj){ 
    obj==null // true 
} 

इस नियम के लिए एक अपवाद है जब एक पूर्णांक के लिए undefined/null कास्टिंग प्रतीत होता है काम करने के लिए जारी रहेगा। यह एक सुंदर उम्र का मामला परिदृश्य है, लेकिन निश्चित रूप से ध्यान दिया जाना चाहिए।

+undefined == +undefined // false 
+null == +null // true 

एक ढीला समानता == ड्रॉप के रूप में null का उपयोग करना:

+(null)==0 जबकि isNaN(+undefined)

को ध्यान में रखते NaN खुद के बराबर नहीं जावास्क्रिप्ट में केवल मूल्य है, तो आप कुछ बहुत पागल चीजों की तरह कर सकते हैं undefined के बदले में सुरक्षित है, बशर्ते आप मूल्य को पूर्णांक में डालने की योजना न बनाएं। जो एक सुंदर किनारे के मामले परिदृश्य है।

उत्तर

6

abstract equality algorithm भाषा कल्पना की धारा 11.9.3 से क्या == और != परिभाषित किया गया है शुरू जाओ और यह परिभाषित करता है उन्हें ऐसा है कि

null == void 0 
null == null 
void 0 == null 

जहां void 0 सिर्फ कहने का एक विश्वसनीय तरीका है undefined (नीचे देखें) तो आपके प्रश्न का उत्तर हाँ है, nullके बराबर और स्वयं और कुछ और नहीं है।

कल्पना के प्रासंगिक भागों

1. If Type(x) is the same as Type(y), then 
    If Type(x) is Undefined, return true. 
    If Type(x) is Null, return true. 
    ... 
2. If x is null and y is undefined, return true. 
3. If x is undefined and y is null, return true. 
... 

हैं आप undefined क्या यह सामान्य रूप से इसका मतलब है, void 0 बजाय उपयोग के अलावा कुछ अर्थ बारे में चिंतित हैं।

null    == void 0   // True 
({}).x    === void 0   // True 
"undefined"  === typeof void 0 // True 
(function() {})() === void 0   // True 
(undefined = 42, 
undefined   === void 0)   // False 
"undefined"  === typeof undefined // False 
"undefined"  === typeof void 0 // True 

language specification से:

11.4.2 शून्य ऑपरेटर

उत्पादन UnaryExpression: शून्यUnaryExpression के रूप में मूल्यांकन किया जाता है इस प्रकार है:

  1. exprयूनरीएक्सप्रेस/का मूल्यांकन करने का परिणाम बनें।
  2. GetValue(expr) पर कॉल करें।
  3. रिटर्न अपरिभाषित

तो void उपसर्ग ऑपरेटर अपने तर्क का मूल्यांकन करता है और विशेष मान देता है अपरिभाषित करने की परवाह किए बिना क्या वैश्विक चर undefined बदल दिया गया है (या undefined परिभाषित किया गया है :)।

संपादित करें: टिप्पणी के जवाब में

आपको लगता है कि दोनों के बीच अलग है, तो आप अंतर से निपटने के लिए की जरूरत है पुस्तकालय कोड के साथ काम कर रहे हैं। भाषा समिति द्वारा मानकीकृत नए पुस्तकालयों में से कुछ अंतर को नजरअंदाज करते हैं: JSON.stringify([void 0]) === "[null]" लेकिन वहाँ बहुत अधिक कोड है कि उन्हें आसानी से अलग ढंग से व्यवहार करता है है, और अन्य अंतर हैं:

+(null) === 0 
isNaN(+undefined) 

"" + null === "null" 
"" + undefined === "undefined" 

आप किसी भी प्रकार के लिख रहे हैं पुस्तकालयों का जो पाठ या क्रमबद्ध/deserialize उत्पन्न करते हैं और आप दोनों को भंग करना चाहते हैं तो आप undefined पास नहीं कर सकते हैं और null के रूप में व्यवहार करने की उम्मीद कर सकते हैं - आपको अपने इनपुट को एक या दूसरे को स्पष्ट रूप से सामान्य करने की आवश्यकता है।

+0

आप 'शून्य 0' का उपयोग करते हुए ऊपर दिए गए कोड में आसानी से 'शून्य' का उपयोग कर सकते हैं। मैं यह भी तर्क दे सकता हूं कि 'शून्य' पढ़ने के लिए थोड़ा आसान है और फिर 'शून्य 0' टाइप करें। मेरा मुद्दा यह है कि दोनों के बीच अंतर करने में कोई मूल्य नहीं है। हालांकि अपरिभाषित एक "अज्ञात मूल्य" का प्रतिनिधित्व करना है, लेकिन वास्तव में इस सम्मेलन में कोई भी नहीं है। तो यह हर जगह मौजूद 'अपरिभाषित' को अनदेखा करने के लिए फायदेमंद दिखाई देगा और बस इसके स्थान पर 'obj == null' का उपयोग करें। – William

+0

@ लाइम, कृपया मेरे संपादन देखें। –

+0

धन्यवाद, मुझे पता नहीं था कि पूर्णांक में डाले जाने पर मूल्य क्या थे। 'NaN' बनाम' 0' होने के कारण निश्चित रूप से अलग है। ऐसा लगता है '[शून्य]। जॉइन (' ')' और '[अपरिभाषित]। जॉइन ('')' हालांकि समकक्ष हैं। – William

2
इस वजह से

:

var myVar1; 
var myVar2 = null; 

if (myVar1 === null) alert('myVar1 is null'); 
if (myVar1 === undefined) alert('myVar1 is undefined'); 
if (myVar2 === null) alert('myVar2 is null'); 
if (myVar2 === undefined) alert('myVar2 is undefined'); 

कुछ भी अशक्त करने के लिए सेट अपरिभाषित नहीं है - यह शून्य के रूप में परिभाषित किया है।

+0

मेरा बिंदु यह है कि दोनों के बीच अंतर करने में कोई मूल्य नहीं है। यद्यपि 'अपरिभाषित' को "अज्ञात मूल्य" का प्रतिनिधित्व करना है, लेकिन वास्तव में इस सम्मेलन में कोई भी नहीं है। – William

+0

मान लीजिए कि आप कभी भी अपरिभाषित मूल्य के लिए कुछ भी असाइन नहीं करते हैं, एक अनछुए चर और एक निरर्थक के बीच अंतर करने में सक्षम होने में मूल्य है। हालांकि, डेवलपर्स द्वारा जेएस का उपयोग कैसे किया जाता है, इस बारे में सभी प्रैक्टिकल उद्देश्यों के लिए, मैं आपके बिंदु को देख सकता हूं ... – Brian

0

पढ़ना जावास्क्रिप्ट: अच्छा भागों, ऐसा लगता है कि केवल बातिल और अपरिभाषित बराबर

जावास्क्रिप्ट समानता ऑपरेटरों के दो सेट हैं कर रहे हैं: === और ==, और उनके बुराई जुड़वां बच्चों == और! =। अच्छे जिस तरह से आप उम्मीद करेंगे काम करते हैं। यदि दो ऑपरेंड एक ही प्रकार के हैं और एक ही मान हैं, तो === सत्य उत्पन्न करता है और! == झूठा उत्पादन करता है। बुराई जुड़वां सही काम करते हैं जब ऑपरेशंस समान प्रकार के होते हैं, लेकिन यदि वे विभिन्न प्रकार के होते हैं, तो वे मानों को मजबूत करने का प्रयास करते हैं।नियम जो वे करते हैं जटिल और अनौपचारिक हैं।

'' == '0' // false 
0 == '' // true 
0 == '0' // true 
false == 'false' // false 
false == '0' // true 
false == undefined // false 
false == null // false 
null == undefined // true 
' \t\r\n ' == 0 // true 

: ये दिलचस्प मामलों में से कुछ हैं "जावास्क्रिप्ट:।। डगलस Crockford कॉपीराइट 2008 याहू इंक द्वारा अच्छा पार्ट्स, 978-0-596-51774-8"

+0

आखिरी वाला भयानक – William

4

क्योंकि जावास्क्रिप्ट दोनों मान हैं। और अन्य भाषाओं में केवल nil/null जावास्क्रिप्ट undefined "अज्ञात मान" होने के साथ बढ़ी है जबकि null स्पष्ट रूप से कुछ भी प्रस्तुत करने के लिए ज्ञात मूल्य नहीं है।

var x जहां x क्योंकि कोई मूल्य नहीं सौंपा गया है अपरिभाषित है और var y = null तुलना करें जहां ynull है। यह कुछ पर सेट किया गया था - "कुछ भी" का प्रतिनिधित्व करने वाला एक संवेदी। बनाम जावास्क्रिप्ट में nullundefined की यह कोर मौलिक उपयोग बहुत गहरी चलाता है और अन्य मामलों में शामिल हैं:

  1. एक लापता (या delete 'घ) संपत्ति भी undefined उपज और नहीं null (यह null में परिणाम होगा ही अगर null किया गया था सौंपना)।
  2. असाइन किए गए फ़ंक्शन पैरामीटर undefined हैं।
  3. undefinedgetElementById जैसे मानक कार्यों से लौटा। टिप्पणी देखो।

इस प्रकार, जावास्क्रिप्ट में, यह अक्सर अधिक undefined और नहीं null उपयोग करने के लिए सही है। वे दोनों अलग-अलग चीजों का प्रतिनिधित्व करते हैं। एक लाइब्रेरी जो इससे लड़ने की कोशिश करती है वह जावास्क्रिप्ट से लड़ रही है।

हैप्पी कोडिंग।


व्यक्तिगत रूप से, लगभग सभी मामलों में मैं undefined या null के लिए एक स्पष्ट की जांच करने से बचें। मेरा मानना ​​है कि ज्यादातर में - लेकिन सभी नहीं - सभी झूठे मूल्यों के बराबर होना चाहिए और यह कहा गया है कि कॉलर्स की जिम्मेदारी सार्वजनिक अनुबंध के अनुरूप है।

क्योंकि इस विश्वास के मैं बहुत अधिक है और अभी तक बहुत कम की रक्षा करने की कोशिश कर के कगार पर तुलना x == null पर विचार करेंगे, लेकिन nullयाundefined पकड़ने के मामले में, यह काम करता है के रूप में बताया। एक प्रवृत्ति ;-)

+1

डीओएम विधियों जैसे 'getElementById' वापसी' null' है क्योंकि 'अपरिभाषित' की धारणा नहीं है [वेबआईडीएल] में मौजूद है (http://www.w3.org/TR/WebIDL/), spec में एक 'शून्य' प्रकार है लेकिन इसका उपयोग केवल उन परिचालनों के लिए किया जाता है जो कोई मूल्य नहीं देते हैं। – CMS

+0

अच्छा उत्तर, यह भी जोड़ देगा: 'हटाएं' '= null' की तुलना में एक अलग परिणाम (' अपरिभाषित') उत्पन्न करता है। – Nicole

+0

लोग वास्तव में जानबूझकर 'अज्ञात मूल्य' के साथ "अज्ञात मूल्य" का प्रतिनिधित्व करते हैं? मैंने कभी इस परिदृश्य को नहीं देखा है, और इसलिए मैंने मूल रूप से सवाल पूछा।यह सिर्फ दो अविश्वसनीय रूप से भ्रमित मूल्य प्रतीत होता है जिनका उपयोग कभी भी उनके मूल उद्देश्य में नहीं किया जाता है। तुलना करने के लिए सब कुछ मानकीकृत 'obj == null' आकार के लिए फायदेमंद होगा और पुन: असाइनमेंट के साथ किसी भी मुद्दे से बचें। सबकुछ काम करना जारी रखेगा 'var obj = {}; obj.nonExistantProperty == null'। 'var x; if (x == null);' – William

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