javascript - एक वस्तु क्यों शून्य है और शून्य और अपरिभाषित के बीच क्या अंतर है?




object null (14)

जावास्क्रिप्ट में null object क्यों माना जाता है?

जांच रहा है

if ( object == null )
      Do something

बराबर

if ( !object )
      Do something

?

और भी:

null और undefined बीच क्या अंतर है?


शून्य और अपरिभाषित के बीच क्या अंतर है ??

एक संपत्ति जब इसकी कोई परिभाषा नहीं है, अपरिभाषित है। शून्य एक वस्तु है। इसका प्रकार वस्तु है। शून्य एक विशेष मान है जिसका अर्थ है "कोई मान नहीं। अपरिभाषित एक वस्तु नहीं है, यह प्रकार अपरिभाषित है।

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

 undefined == null
 null == undefined

अधिक विस्तार के लिए शून्य और अपरिभाषित के बीच जावास्क्रिप्ट अंतर का संदर्भ लें।

और आपके नए संपादन हां के साथ

if (object == null)  does mean the same  if(!object)

जब ऑब्जेक्ट गलत होता है तो परीक्षण करते हैं, तो वे दोनों झूठ बोलते समय केवल स्थिति को पूरा करते हैं, लेकिन जब सही नहीं होते हैं

यहां देखें: जावास्क्रिप्ट गॉचा


  1. अपरिभाषित मतलब है कि एक चर घोषित कर दिया गया है लेकिन इसे किसी भी मान को असाइन नहीं किया गया है, जबकि नल को "कोई मान" का प्रतिनिधित्व करने वाले चर को असाइन नहीं किया जा सकता है। (नल एक असाइनमेंट ऑपरेटर है)

2. अविभाजित एक प्रकार है जबकि नल एक वस्तु है।

3. जावास्क्रिप्ट स्वयं को किसी भी असाइन किए गए वैरिएबल को अपरिभाषित करने के लिए प्रारंभ कर सकता है लेकिन यह कभी भी चर के मान को शून्य पर सेट नहीं कर सकता है। इसे प्रोग्रामिक रूप से किया जाना है।


अपरिभाषित की तुलना में शून्य के बारे में अन्य मजेदार बात यह है कि इसे बढ़ाया जा सकता है।

x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0

यह काउंटर के लिए डिफ़ॉल्ट संख्यात्मक मान सेट करने के लिए उपयोगी है। आपने अपनी घोषणा में कितनी बार एक चर को -1 तक सेट किया है?


इस स्निपेट में अंतर का सारांश दिया जा सकता है:

alert(typeof(null));      // object
alert(typeof(undefined)); // undefined

alert(null !== undefined) //true
alert(null == undefined)  //true

जाँच हो रही है

object == null यह देखने के लिए अलग है if ( !object )

उत्तरार्द्ध बराबर है ! Boolean(object) ! Boolean(object) , क्योंकि यूनरी ! ऑपरेटर स्वचालित रूप से सही ऑपरेंड को एक बूलियन में डाल देता है।

चूंकि Boolean(null) झूठी बराबर है !false === true

तो यदि आपकी वस्तु शून्य नहीं है , लेकिन झूठी या 0 या "" चेक पास हो जाएगी क्योंकि:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false

उदाहरण के लिए window.someWeirdProperty अपरिभाषित है, इसलिए

"window.someWeirdProperty === null" झूठ के दौरान मूल्यांकन करता है

"window.someWeirdProperty === undefined" सत्य का मूल्यांकन करता है।

इसके अलावा चेकिफ़ if (!o) false होने के लिए if (o == null) जांच के समान नहीं है।


कुछ परिशुद्धताएं:

शून्य और अपरिभाषित दो अलग-अलग मान हैं। एक नाम के लिए मूल्य की अनुपस्थिति का प्रतिनिधित्व कर रहा है और दूसरा नाम की अनुपस्थिति का प्रतिनिधित्व कर रहा है।

if( o ) लिए निम्नानुसार होता है if क्या होता है:

कोष्ठक ओ में अभिव्यक्ति का मूल्यांकन किया जाता है, और उसके बाद if कोष्ठक में अभिव्यक्ति के मूल्य को टाइप-कॉरर्स करने में मदद मिलती है - हमारे मामले में o

फाल्सी (जो झूठी हो जाएगी) जावास्क्रिप्ट में मान हैं: '', शून्य, अपरिभाषित, 0, और झूठी


निकोलस सी। जकास द्वारा "ऑब्जेक्ट ओरिएंटेड जावास्क्रिप्ट के सिद्धांत" से

लेकिन जब ऑब्जेक्ट शून्य है तो ऑब्जेक्ट क्यों? (वास्तव में, इसे टीसी 3 9 द्वारा एक त्रुटि के रूप में स्वीकार किया गया है, जो समिति जावास्क्रिप्ट को डिज़ाइन और रखरखाव करती है। आप तर्क दे सकते हैं कि शून्य एक खाली ऑब्जेक्ट पॉइंटर है, जो "ऑब्जेक्ट" को लॉजिकल रिटर्न वैल्यू बनाता है, लेकिन यह अभी भी भ्रमित है।)

जाकास, निकोलस सी। (2014-02-07)। ऑब्जेक्ट ओरिएंटेड जावास्क्रिप्ट के सिद्धांत (जलाने के स्थान 226-227)। कोई स्टार्च प्रेस नहीं। किंडल संस्करण।

ने कहा कि:

var game = null; //typeof(game) is "object"

game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {}; 
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;

अपरिभाषित मामला:

var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.

निम्नलिखित फ़ंक्शन दिखाता है कि अंतर को दूर करने में सक्षम क्यों है और सक्षम है:

function test() {
        var myObj = {};
        console.log(myObj.myProperty);
        myObj.myProperty = null;
        console.log(myObj.myProperty);
}

अगर आप कॉल करते हैं

test();

आप मिल रहे हैं

अपरिभाषित

शून्य

पहला console.log(...) myProperty से myObj प्राप्त करने का प्रयास करता है, जबकि इसे अभी तक परिभाषित नहीं किया गया है - इसलिए यह वापस "अपरिभाषित" हो जाता है। इसे शून्य करने के बाद, दूसरा console.log(...) स्पष्ट रूप से "शून्य" देता है क्योंकि myProperty मौजूद है, लेकिन इसमें मूल्य null है।

इस अंतर को पूछने में सक्षम होने के लिए, जावास्क्रिप्ट में null और undefined : जबकि null है - बस अन्य भाषाओं की तरह एक वस्तु, undefined एक वस्तु नहीं हो सकती है क्योंकि कोई उदाहरण नहीं है (यहां तक ​​कि एक null उदाहरण भी नहीं) उपलब्ध है।


शून्य और अपरिभाषित दोनों मूल्य समानता के लिए झूठे हैं (शून्य == अपरिभाषित): वे दोनों बूलियन झूठ के लिए पतन हो जाते हैं। वे एक ही वस्तु नहीं हैं (शून्य! == अपरिभाषित)।

अपरिभाषित वैश्विक वस्तु (ब्राउज़र में "खिड़की") की एक संपत्ति है, लेकिन यह एक प्राचीन प्रकार है और न कि वस्तु है। यह अविश्वसनीय चर और रिटर्न स्टेटमेंट के बिना समाप्त होने वाले कार्यों के लिए डिफ़ॉल्ट मान है।

नल ऑब्जेक्ट का एक उदाहरण है। शून्य का उपयोग डीओएम विधियों के लिए किया जाता है जो रिक्त परिणाम इंगित करने के लिए संग्रह ऑब्जेक्ट्स लौटाते हैं, जो किसी त्रुटि को इंगित किए बिना झूठा मान प्रदान करता है।


शून्य और अपरिभाषित होने का एक तरीका यह समझना है कि प्रत्येक कहां होता है।

निम्नलिखित स्थितियों में शून्य वापसी मान की अपेक्षा करें:

  • डीओएम से पूछताछ करने वाले तरीके

    console.log(window.document.getElementById("nonExistentElement"));
    //Prints: null
    
  • एक अजाक्स अनुरोध से प्राप्त JSON प्रतिक्रियाएं


    {
      name: "Bob",
      address: null
    }
  • RegEx.exec

  • नई कार्यक्षमता जो प्रवाह की स्थिति में है। निम्नलिखित शून्य लौटाता है:


        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");

गैर-अस्तित्व के अन्य सभी मामलों को अनिर्धारित (जैसा कि @ एक्सेल द्वारा नोट किया गया है) द्वारा दर्शाया गया है। निम्नलिखित में से प्रत्येक प्रिंट "अपरिभाषित":

    var uninitalised;
    console.log(uninitalised);

    var obj = {};
    console.log(obj.nonExistent);

    function missingParam(missing){
        console.log(missing);
    }

    missingParam();

    var arr = [];
    console.log(arr.pop());        

बेशक अगर आप var unitialised = null लिखने का फैसला करते हैं; या अपने आप को एक विधि से शून्य वापस कर दें तो आप अन्य परिस्थितियों में शून्य हो रहे हैं। लेकिन यह बहुत स्पष्ट होना चाहिए।

एक तीसरा मामला तब होता है जब आप एक चर का उपयोग करना चाहते हैं लेकिन आप यह भी नहीं जानते कि इसे घोषित किया गया है या नहीं। उस संदर्भ के लिए संदर्भ त्रुटि से बचने के लिए टाइप का उपयोग करें:

if(typeof unknown !== "undefined"){
    //use unknown
}

संक्षेप में संक्षेप में जांच करें जब आप डोम में हेरफेर कर रहे हैं, अजाक्स से निपट रहे हैं, या कुछ ईसीएमएस्क्रिप्ट 5 सुविधाओं का उपयोग कर रहे हैं। अन्य सभी मामलों के लिए सख्त समानता के साथ अपरिभाषित की जांच करना सुरक्षित है:

if(value === undefined){
  // stuff
}

null एक वस्तु नहीं है , यह एक आदिम मूल्य है । उदाहरण के लिए, आप इसमें गुण नहीं जोड़ सकते हैं। कभी-कभी लोग गलत तरीके से मानते हैं कि यह एक वस्तु है, क्योंकि typeof null रिटर्न "object" । लेकिन यह वास्तव में एक बग है (जिसे ईसीएमएस्क्रिप्ट 6 में भी तय किया जा सकता है)।

null और undefined बीच का अंतर निम्नानुसार है:

  • undefined : जावास्क्रिप्ट द्वारा उपयोग किया जाता है और इसका मतलब है "कोई मूल्य नहीं"। अनियमित चर, अनुपलब्ध पैरामीटर और अज्ञात चर के पास वह मान है।

    > var noValueYet;
    > console.log(noValueYet);
    undefined
    
    > function foo(x) { console.log(x) }
    > foo()
    undefined
    
    > var obj = {};
    > console.log(obj.unknownProperty)
    undefined
    

    अज्ञात चरों तक पहुंचने, हालांकि, अपवाद उत्पन्न करता है:

    > unknownVariable
    ReferenceError: unknownVariable is not defined
    
  • null : प्रोग्रामर द्वारा "कोई मूल्य" इंगित करने के लिए उपयोग किया जाता है, उदाहरण के लिए किसी फ़ंक्शन के पैरामीटर के रूप में।

एक चर की जांच:

console.log(typeof unknownVariable === "undefined"); // true

var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true

var bar = null;
console.log(bar === null); // true

एक सामान्य नियम के रूप में, आपको हमेशा जावास्क्रिप्ट में === और कभी == का उपयोग नहीं करना चाहिए (== सभी प्रकार के रूपांतरण करता है जो अप्रत्याशित परिणाम उत्पन्न कर सकते हैं)। चेक x == null एक एज केस है, क्योंकि यह null और undefined दोनों के लिए काम करता है:

> null == null
true
> undefined == null
true

यह जांचने का एक आम तरीका है कि एक चर के पास मूल्य है या नहीं, इसे बूलियन में परिवर्तित करना है और देखें कि यह true है या नहीं। वह रूपांतरण if कथन और बुलियन ऑपरेटर द्वारा किया जाता है! ("नहीं")।

function foo(param) {
    if (param) {
        // ...
    }
}
function foo(param) {
    if (! param) param = "abc";
}
function foo(param) {
    // || returns first operand that can't be converted to false
    param = param || "abc";
}

इस दृष्टिकोण का दोष: निम्नलिखित सभी मान false मूल्यांकन false , इसलिए आपको सावधान रहना होगा (उदाहरण के लिए, उपरोक्त चेक undefined और 0 बीच अंतर नहीं कर सकते हैं)।

  • undefined , null
  • बूलियन: false
  • संख्याएं: +0 , -0 , NaN
  • स्ट्रिंग्स: ""

आप Boolean को फ़ंक्शन के रूप में उपयोग करके Boolean में रूपांतरण का परीक्षण कर सकते हैं (आमतौर पर यह एक कन्स्ट्रक्टर है, जिसका उपयोग new साथ किया जा सकता है):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true

null एक वस्तु है। इसका प्रकार शून्य है। undefined एक वस्तु नहीं है; इसका प्रकार अपरिभाषित है।


(name is undefined)

आप: name क्या है? (*)
जावास्क्रिप्ट: name ? name क्या है मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं। आपने पहले कभी भी किसी भी name का उल्लेख नहीं किया है। क्या आप (क्लाइंट-) पक्ष पर कुछ अन्य स्क्रिप्टिंग भाषा देख रहे हैं?

name = null;

आप: name क्या है?
जावास्क्रिप्ट: मुझे नहीं पता।

संक्षेप में; undefined वह जगह है जहां चीज की कोई धारणा मौजूद नहीं है; इसमें कोई प्रकार नहीं है, और उस दायरे में पहले कभी संदर्भित नहीं किया गया है; null वह जगह है जहां चीज मौजूद है, लेकिन यह ज्ञात नहीं है कि मूल्य क्या है।

याद रखने की एक बात यह है कि null , अवधारणात्मक रूप से, false या "" जैसी नहीं है, भले ही वे प्रकार के कास्टिंग के बाद समान हों, यानी

name = false;

आप: name क्या है?
जावास्क्रिप्ट: बूलियन झूठी।

name = '';

आप: name क्या है?
जावास्क्रिप्ट: खाली स्ट्रिंग

*: इस संदर्भ में name एक चर के रूप में है जिसे कभी परिभाषित नहीं किया गया है। यह कोई अपरिभाषित चर हो सकता है। हालांकि, नाम किसी भी HTML फॉर्म तत्व की संपत्ति है। यह रास्ता, रास्ता वापस चला गया और आईडी से पहले अच्छी तरह से स्थापित किया गया था। यह उपयोगी है क्योंकि आईडी अद्वितीय होनी चाहिए लेकिन नाम होने की आवश्यकता नहीं है।


var x = null;

एक्स को शून्य के रूप में परिभाषित किया गया है

वाई परिभाषित नहीं है; // क्योंकि मैंने इसे परिभाषित नहीं किया था

if (!x)

शून्य के रूप में मूल्यांकन किया जाता है





typeof