अशक्त वस्तु क्यों है और अशक्त और अपरिभाषित में क्या अंतर है?


866

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

जाँच कर रहा है

if ( object == null )
      Do something

बराबर

if ( !object )
      Do something

?

और भी:

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


6
यदि शीर्षक में अंतिम प्रश्न जोड़ा जाता है तो यह बहुत अच्छा होगा। यहाँ के उत्तर बहुत ही शानदार हैं, लेकिन शीर्षक इस बात का संकेत नहीं दे सकता है कि आपको यह उत्तर यहाँ मिलेगा
marcos.borunda

6
Null जावास्क्रिप्ट में एक वस्तु नहीं है! typeof null === 'object'लेकिन यह एक बग है! यहाँ एक लिंक है सभी वीडियो देखें और आनंद लें :)
CoR

1
मैं एक अपरिभाषित और NULL मूल्यवान चर के लिए axiomatic सत्य के रूप में C / C ++ का उपयोग करना पसंद करता हूं, क्योंकि यह बहुत सीधा है। फिर देखें कि वे परिभाषाएँ अन्य भाषाओं के विनिर्देशों की तुलना कैसे करती हैं।
समिस

जवाबों:


1488
(name is undefined)

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

name = null;

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

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

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

name = false;

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

name = '';

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


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


14
लेकिन जावास्क्रिप्ट में, खाली स्ट्रिंग '' अभी भी एक बूलियन झूठी है।
एंड्रियास ग्रीच

117
खाली स्ट्रिंग बूलियन झूठी नहीं है, लेकिन एक सशर्त के संदर्भ में इसे एक गलत (y) मान (जबरदस्ती) के रूप में व्याख्या की जाती है।
ब्रायन मैथ्यूज

22
दूसरे मामले के लिए, जहां नाम = अशक्त, 'आई नॉट नो' के बजाय, जावास्क्रिप्ट जवाब दे सकता है: अशक्त वस्तु। इसके अलावा मुझे उत्तर की शैली पसंद है।
जीन विंसेंट

16
"मुझे नहीं पता" के बजाय, मैं कहूंगा कि इसका उत्तर null"कुछ भी नहीं" है। नल को सटीक रूप से परिभाषित किया गया है जिसका कोई मूल्य नहीं है। शून्य, नील, नाडा। कुछ भी तो नहीं।
20

50
उत्तर देने की उस शैली से प्यार करें। सामान्य तौर पर, "आपने name पहले कभी कोई उल्लेख नहीं किया है " सच है। हालांकि, एक मान को बताए बिना एक चर घोषित करना ( var somevar;), आश्चर्यजनक रूप से अभी भी पर्याप्त परिणाम देगा undefined
एमसी सम्राट

142

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

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

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

जाँच हो रही है

object == nullजाँच करने के लिए अलग है if ( !object )

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

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

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

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

@kentaromiura हमारे लिए जावास्क्रिप्ट नोब्स ... शायद केवल मैं ... यह बूलियन (मूल्य) सिंटैक्स क्या है? एक बूलियन के लिए कास्टिंग?
xr280xr

@ xr280xr हाँ, यह कास्टिंग है। String(null)कास्टिंग का एक और उदाहरण देखने की कोशिश करें । तुम भी मूर्खतापूर्ण बातें कर सकते हैं जैसे Number(null + 2)... लेकिन आपको :-) नहीं होना चाहिए। Kentaromiura से उत्कृष्ट जवाब।
स्क्वीडबे

याद रखना typeofएक ऑपरेटर है। आप कोष्ठक में ऑपरेंड को उसी कारण से नहीं लपेटेंगे जिस कारण से आप नहीं लिखेंगे var sum = 1 +(1);
एलेक्स

124

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

के बीच का अंतर nullऔर undefinedइस प्रकार है:

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

    > 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, इसलिए आपको सावधान रहना होगा (उदाहरण के लिए, उपरोक्त चेक undefinedऔर के बीच अंतर नहीं कर सकते हैं 0)।

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

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

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

1
क्यों संदर्भ +0और -0अलग अगर +0 === -0?
रेयानोस 3

6
शायद क्योंकि आप अभी भी अलग कर सकते हैं +0और -0: 1/+0 !== 1/-0
नवगीत

1
एक पोस्ट है कि लिंक स्रोत के रूप में इस जवाब को वापस करने के लिए इस उत्तर लिंक ... शायद इस बजाय के लिए लिंक करने के लिए होती 2ality.com/2013/10/typeof-null.html
रिकार्डो टोमासी

ओह ठीक है, सी की तरह, जहां अनधिकृत चर घोषणाओं को अपरिभाषित माना जाता है (पुराने संस्करणों में वास्तव में पिछले प्रोग्राम डेटा हो सकते हैं)।
समिस

5
"लेकिन यह वास्तव में एक बग है (जो कि ECMAScript 6 में भी तय किया जा सकता है)" - स्रोत?
गजस

26

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

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

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

 undefined == null
 null == undefined

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

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

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

जब परीक्षण झूठा होता है, तो वे दोनों केवल शर्त को पूरा करते हैं जब परीक्षण गलत होता है , लेकिन सच नहीं होने पर

यहां देखें: जावास्क्रिप्ट मिलाप


4
आपको === का उपयोग करना चाहिए, फिर अपरिभाषित! == null: D
olliej

1
अंतिम भाग पर ध्यान दें, गलत है मेरा उत्तर देखें;)
केन्ट्रोमिओरा

6
ऑब्जेक्ट "ऑब्जेक्ट == null" के समान नहीं है ... वास्तव में, वे काफी अलग हैं। यदि ऑब्जेक्ट 0 है, तो ऑब्जेक्ट सही वापस आ जाएगा, एक खाली स्ट्रिंग, बूलियन झूठी, अपरिभाषित या अशक्त।
जेम्स

3
क्या नल वास्तव में एक वस्तु है? आपके द्वारा दिए गए 1st लिंक ने टाइपऑफ द्वारा चेक शून्य प्रदान किया है, लेकिन टाइपऑफ़ (नल) भाषा डिज़ाइन त्रुटि के कारण 'ऑब्जेक्ट' का मूल्यांकन करता है।
c4il

2
nullकोई वस्तु नहीं है। यह typeof null == 'object';सच है कि एक बग के कारण जो जावास्क्रिप्ट में तय नहीं किया जा सकता है (वर्तमान में, लेकिन भविष्य में बदल सकता है)।
मोहम्मद

21

प्रश्न का पहला भाग:

Null को JavaScript में ऑब्जेक्ट क्यों माना जाता है?

यह एक जावास्क्रिप्ट डिज़ाइन त्रुटि है जिसे वे अब ठीक नहीं कर सकते। यह प्रकार अशक्त होना चाहिए, प्रकार वस्तु नहीं, या बिल्कुल नहीं होना चाहिए। वास्तविक वस्तुओं का पता लगाने और बग का स्रोत होने पर यह एक अतिरिक्त जांच (कभी-कभी भूल गया) की आवश्यकता होती है।

प्रश्न का दूसरा भाग:

के


if (object == null)
Do something

रूप में ही जाँच कर रहा है

if (!object)
Do something

दो चेक हमेशा के लिए दोनों झूठे होते हैं:

  • ऑब्जेक्ट अपरिभाषित या अशक्त है: दोनों सत्य।

  • वस्तु आदिम है, और 0, ""या असत्य: पहले असत्य की जाँच करें, दूसरी सच्ची।

वस्तु एक आदिम नहीं है, लेकिन एक वास्तविक वस्तु की तरह हैं new Number(0), new String("")या new Boolean(false)तो दोनों चेकों झूठे हैं।

इसलिए अगर 'ऑब्जेक्ट' की व्याख्या वास्तविक ऑब्जेक्ट से की जाती है, तो दोनों चेक हमेशा समान होते हैं। यदि प्रिमिटिव की अनुमति है तो चेक 0 "", और गलत के लिए अलग-अलग हैं ।

जैसे मामलों में object==null, अस्पष्ट परिणाम बग का स्रोत हो सकता है। का उपयोग ==कभी अनुशंसित नहीं है, ===इसके बजाय का उपयोग करें ।

प्रश्न का तीसरा भाग:

और यह भी:

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

जावास्क्रिप्ट में, एक अंतर यह है कि अशक्त प्रकार की वस्तु है और अपरिभाषित प्रकार अपरिभाषित है।

जावास्क्रिप्ट में, null==undefinedसच है, और यदि बराबर की अनदेखी की जाती है, तो इसे समान माना जाता है। उन्होंने फैसला क्यों किया, लेकिन 0, ""और झूठ बराबर नहीं हैं, मुझे नहीं पता। यह एक मनमाना मत है।

जावास्क्रिप्ट में, null===undefinedसच नहीं है क्योंकि प्रकार में समान होना चाहिए ===

वास्तव में, अशक्त और अपरिभाषित समान हैं, क्योंकि वे दोनों गैर-अस्तित्व का प्रतिनिधित्व करते हैं। तो 0 करो, और ""उस मामले के लिए भी, और शायद खाली कंटेनर []और {}। इतने ही प्रकार के कुछ भी बग के लिए कोई नुस्खा नहीं है। एक प्रकार या कोई भी बेहतर नहीं है। मैं जितना संभव हो उतना कम उपयोग करने की कोशिश करूंगा।

'झूठा', 'सच', और '!' कीड़े के एक और बैग को सरल बनाया जा सकता है, उदाहरण के लिए, if(!x)और if(x)अकेले पर्याप्त हैं, आपको सच्चे और झूठे की आवश्यकता नहीं है।

एक घोषित var xप्रकार अपरिभाषित है यदि कोई मूल्य नहीं दिया जाता है, लेकिन यह उसी तरह होना चाहिए जैसे कि x को कभी भी घोषित नहीं किया गया था। एक और बग स्रोत एक खाली कुछ भी नहीं कंटेनर है। इसलिए इसे घोषित करना और इसे एक साथ परिभाषित करना सबसे अच्छा है, जैसे var x=1

लोग इन सभी विभिन्न प्रकारों के बारे में जानने की कोशिश करते हुए गोल-गोल घेरे में जा रहे हैं, लेकिन जटिल कपड़ों में यह सब एक ही बात है। हकीकत है

undefined===undeclared===null===0===""===[]==={}===nothing

और शायद सभी को अपवादों को फेंक देना चाहिए।


8
महान उत्तर, लेकिन यह थोड़ी दूर तक जाता है []: " वास्तव में, अशक्त और अपरिभाषित समान हैं ... और शायद खाली कंटेनर [] और {}। " आप शायद मुझे सोच में बात कर सकते हैं {} कुछ होना चाहिए। अशक्त का स्वाद, लेकिन मेरी धारणा है कि यह नहीं होना चाहिए। लेकिन कम विवादास्पद रूप से, एक खाली सरणी []में एक .push()फ़ंक्शन होता है , इसलिए [] शून्य होने के लिए कोई अच्छा तर्क नहीं है। $ 0.02।
रफिन

11
var x = null;

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

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

if (!x)

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


8

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

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

  • DOM को क्वेरी करने वाले तरीके

    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");

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

    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 युनिवैलिज्ड = null लिखने का निर्णय लेते हैं; या अपने आप में एक विधि से अशक्त वापसी तो आप अन्य स्थितियों में होने वाली अशक्तता है। लेकिन यह बहुत स्पष्ट होना चाहिए।

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

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

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

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

8

जावास्क्रिप्ट में कई अलग-अलग नल जांचों की तुलना:

http://jsfiddle.net/aaronhoffman/DdRHB/5/

// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;

...trim...

http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html

जावास्क्रिप्ट नल चेक तुलना चार्ट


1
"var myUndefined;" चर को परिभाषित करें (अज्ञात प्रकार के साथ एक ज्ञात चर के रूप में)?
क्यूई फैन

6

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

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

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


5

कुछ प्राथमिकताएँ:

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


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

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

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


5

का जवाब देने के लिए जोड़ने के लिए, क्या के बीच differrence है undefinedऔरnull से, जावास्क्रिप्ट निश्चित गाइड 6 संस्करण, इस पृष्ठ पर p.41 :

आप undefinedसिस्टम-स्तर का प्रतिनिधित्व कर सकते हैं , मूल्य के अनपेक्षित या त्रुटि जैसी अनुपस्थिति का nullप्रतिनिधित्व कर सकते हैं और मूल्य के कार्यक्रम-स्तर, सामान्य, या अपेक्षित अनुपस्थिति का प्रतिनिधित्व करने के लिए। यदि आपको इनमें से किसी एक मान को एक चर या संपत्ति में निर्दिष्ट करना है या इनमें से किसी एक मान को किसी फ़ंक्शन में पास करना है, nullतो लगभग हमेशा सही विकल्प होता है।


3

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


11
गलत - दोनों nullऔर undefinedआदिम मूल्य हैं - typeof null === 'object'एक भाषा बग है, क्योंकिObject(null) !== null
क्रिस्टोफ़

नहीं यह नहीं है। ऑब्जेक्ट () उस तरह से काम करते हैं, देखें ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - 15.2.2.1 नई वस्तु ([मूल्य]) ... 8. (तर्क मान) आपूर्ति नहीं की गई थी या इसका प्रकार अशक्त या अपरिभाषित नहीं था।) एक नया देशी ECMAScript ऑब्जेक्ट बनाएं। [[प्रोटोटाइप]] नवनिर्मित वस्तु की संपत्ति ऑब्जेक्ट प्रोटोटाइप ऑब्जेक्ट पर सेट है। [[वर्ग]] नवनिर्मित वस्तु की संपत्ति "ऑब्जेक्ट" पर सेट है। नवनिर्मित वस्तु में कोई [[मूल्य]] संपत्ति नहीं है। नई बनाई गई मूल वस्तु वापस करें।
कण्ट्रोमोईरा

3
@ क्रिसटोफ: मेरा मतलब है, आप सही कह रहे हैं। अशक्त एक प्रकार का होना चाहिए , मेरा मतलब है कि आप इसे इस तरह से नहीं देख सकते हैं क्योंकि: चेतावनी (नई वस्तु () = = नई वस्तु ()); / * सच, नया istance समान istance / अलर्ट (ऑब्जेक्ट (नल)) .constructor /= {} .constructor) नहीं है; / युक्ति के रूप में सच / चेतावनी (ऑब्जेक्ट (शून्य) .prototyp == {} .prototype); / युक्ति के रूप में सच / चेतावनी (अशक्त उदाहरण वस्तु); / स्पष्ट रूप से गलत, शून्य का तात्पर्य त्वरित नहीं है / लेकिन मूल रूप से एक कल्पना बग एक्सडी है देखें: uselesspickles.com/blog/2006/06/12/… और javascript.crockford.com/remedial.html
kentaromiura/

2

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

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) उपलब्ध है।


2

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

"window.someWeirdProperty === null" जबकि झूठ का मूल्यांकन करता है

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

इसके अलावा checkif if (!o)जाँच के समान नहीं है if (o == null)के लिए oकिया जा रहा है false


क्या आप दो शर्तों के बीच के अंतर को विस्तृत कर सकते हैं
राहुल

मेरा जवाब पढ़ें, उनका मतलब है कि यदि ओ 0, झूठ या "बूलियन मान के बराबर है, तो यह गलत है: var undef, विभिन्न = [0," ", null, false, undef]; के लिए (विभिन्न obj में विभिन्न) {सतर्क (! obj); // IE में 4 बार गलत, 5 में FF;)}
kentaromiura

2

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

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

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


2

में जावास्क्रिप्ट null एक नहीं है objectप्रकार यह एक है primitaveप्रकार।

अंतर क्या है? अनिर्धारित एक पॉइंटर को संदर्भित करता है जिसे सेट नहीं किया गया है। अशक्त को संदर्भित करता है नल सूचक उदाहरण के लिए कुछ मैन्युअल रूप से प्रकार के लिए एक चर सेट किया हैnull


2

इसे देखो:

   <script>
function f(a){
  alert(typeof(a));
  if (a==null) alert('null');
  a?alert(true):alert(false);
}
</script>
                                          //return:
<button onclick="f()">nothing</button>    //undefined    null    false
<button onclick="f(null)">null</button>   //object       null    false
<button onclick="f('')">empty</button>    //string               false
<button onclick="f(0)">zero</button>      //number               false
<button onclick="f(1)">int</button>       //number               true
<button onclick="f('x')">str</button>     //string               true

1

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

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

ज़कस, निकोलस सी। (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.

1

'अशक्त' के बारे में सोचने का सबसे अच्छा तरीका यह याद रखना है कि डेटाबेस में समान अवधारणा का उपयोग कैसे किया जाता है, जहां यह इंगित करता है कि किसी फ़ील्ड में "बिल्कुल भी कोई मूल्य नहीं है।"

  • हां, आइटम का मूल्य ज्ञात है; यह है 'को परिभाषित किया।' इसे इनिशियलाइज़ किया गया है।
  • आइटम का मूल्य है: "कोई मूल्य नहीं है।"

यह उन प्रोग्रामों को लिखने के लिए एक बहुत ही उपयोगी तकनीक है जो अधिक आसानी से डीबग किए जाते हैं। एक 'अपरिभाषित' चर बग का परिणाम हो सकता है ... (आपको कैसे पता चलेगा?) ... लेकिन यदि चर में मान शून्य है, तो आप जानते हैं कि "कोई व्यक्ति, इस कार्यक्रम में कहीं, इसे सेट करें 'null।' 'इसलिए, मेरा सुझाव है कि, जब आपको किसी वैरिएबल के मूल्य से छुटकारा पाना हो, तो "डिलीट" न करें ... इसे' null 'पर सेट करें। पुराना मूल्य अनाथ हो जाएगा और जल्द ही कचरा एकत्र किया जाएगा; नया मान है, "कोई मूल्य नहीं है (अब)।" दोनों मामलों में, चर की स्थिति निश्चित है: "यह स्पष्ट रूप से, जानबूझकर, इस तरह से मिला है।"


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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.