जावास्क्रिप्ट में क्यों null
माना जाता object
है?
जाँच कर रहा है
if ( object == null )
Do something
बराबर
if ( !object )
Do something
?
और भी:
बीच क्या अंतर है null
और undefined
?
जावास्क्रिप्ट में क्यों null
माना जाता object
है?
जाँच कर रहा है
if ( object == null )
Do something
बराबर
if ( !object )
Do something
?
और भी:
बीच क्या अंतर है null
और undefined
?
जवाबों:
(name is undefined)
आप: क्या है name
? (*)
जावास्क्रिप्ट name
:? क्या है name
? मैं नहीं जानता कि आप किस बारे में बात कर रहे हैं। आपने name
पहले कभी कोई उल्लेख नहीं किया है । क्या आप (क्लाइंट-) पक्ष पर कुछ अन्य स्क्रिप्टिंग भाषा देख रहे हैं?
name = null;
आप: क्या है name
?
जावास्क्रिप्ट: मुझे नहीं पता।
संक्षेप में; undefined
वह जगह है जहाँ चीज़ की कोई धारणा मौजूद नहीं है; इसका कोई प्रकार नहीं है, और इसे उस दायरे से पहले संदर्भित नहीं किया गया है; null
वह जगह है जहाँ चीज़ का अस्तित्व है, लेकिन यह ज्ञात नहीं है कि मूल्य क्या है।
एक बात याद रखना है कि है null
, के रूप में ही नहीं है, धारणात्मक false
या ""
या इस तरह के, भले ही वे प्रकार कास्टिंग, यानी के बाद समानता
name = false;
आप: क्या है name
?
जावास्क्रिप्ट: बूलियन झूठी।
name = '';
आप: क्या है name
?
जावास्क्रिप्ट: खाली स्ट्रिंग
* - name
इस संदर्भ में एक चर के रूप में अभिप्रेत है जिसे कभी परिभाषित नहीं किया गया है। यह कोई अपरिभाषित चर हो सकता है, हालांकि, नाम किसी भी HTML फार्म तत्व के बारे में एक संपत्ति है। यह रास्ता, रास्ता वापस जाता है और आईडी से पहले अच्छी तरह से बनाया गया था। यह उपयोगी है क्योंकि आईडी अद्वितीय होनी चाहिए लेकिन नाम नहीं होना चाहिए।
null
"कुछ भी नहीं" है। नल को सटीक रूप से परिभाषित किया गया है जिसका कोई मूल्य नहीं है। शून्य, नील, नाडा। कुछ भी तो नहीं।
name
पहले कभी कोई उल्लेख नहीं किया है " सच है। हालांकि, एक मान को बताए बिना एक चर घोषित करना ( var somevar;
), आश्चर्यजनक रूप से अभी भी पर्याप्त परिणाम देगा undefined
।
अंतर को इस स्निपेट में संक्षेपित किया जा सकता है:
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
String(null)
कास्टिंग का एक और उदाहरण देखने की कोशिश करें । तुम भी मूर्खतापूर्ण बातें कर सकते हैं जैसे Number(null + 2)
... लेकिन आपको :-) नहीं होना चाहिए। Kentaromiura से उत्कृष्ट जवाब।
typeof
एक ऑपरेटर है। आप कोष्ठक में ऑपरेंड को उसी कारण से नहीं लपेटेंगे जिस कारण से आप नहीं लिखेंगे var sum = 1 +(1);
।
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
+0
और -0
अलग अगर +0 === -0
?
+0
और -0
: 1/+0 !== 1/-0
।
अशक्त और अपरिभाषित के बीच अंतर क्या है ??
ऐसी संपत्ति, जिसकी कोई परिभाषा नहीं है, अपरिभाषित है। अशक्त वस्तु है। इसका प्रकार वस्तु है। नल एक विशेष मूल्य का अर्थ है "कोई मूल्य नहीं। अपरिभाषित कोई वस्तु नहीं है, यह प्रकार अपरिभाषित है।
आप एक चर घोषित कर सकते हैं, इसे शून्य पर सेट कर सकते हैं, और व्यवहार समान है सिवाय इसके कि आप "अशक्त" बनाम "अपरिभाषित" छपे हुए देखेंगे। आप एक ऐसे चर की तुलना भी कर सकते हैं जो अशक्त या इसके विपरीत है, और स्थिति सत्य होगी:
undefined == null
null == undefined
अधिक विस्तार के लिए रिक्त और अपरिभाषित के बीच जावास्क्रिप्ट अंतर का संदर्भ लें ।
और अपने नए संपादन के साथ हाँ
if (object == null) does mean the same if(!object)
जब परीक्षण झूठा होता है, तो वे दोनों केवल शर्त को पूरा करते हैं जब परीक्षण गलत होता है , लेकिन सच नहीं होने पर
यहां देखें: जावास्क्रिप्ट मिलाप
null
कोई वस्तु नहीं है। यह typeof null == 'object';
सच है कि एक बग के कारण जो जावास्क्रिप्ट में तय नहीं किया जा सकता है (वर्तमान में, लेकिन भविष्य में बदल सकता है)।
प्रश्न का पहला भाग:
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
और शायद सभी को अपवादों को फेंक देना चाहिए।
[]
में एक .push()
फ़ंक्शन होता है , इसलिए [] शून्य होने के लिए कोई अच्छा तर्क नहीं है। $ 0.02।
var x = null;
x को शून्य के रूप में परिभाषित किया गया है
y परिभाषित नहीं है; // क्योंकि मैंने इसे परिभाषित नहीं किया है
if (!x)
अशक्त का मूल्यांकन असत्य के रूप में किया जाता है
अशक्त और अपरिभाषित की भावना बनाने का एक तरीका यह समझना है कि प्रत्येक कहाँ होता है।
निम्नलिखित स्थितियों में शून्य वापसी मूल्य की अपेक्षा करें:
DOM को क्वेरी करने वाले तरीके
console.log(window.document.getElementById("nonExistentElement"));
//Prints: null
JSON प्रतिक्रियाएँ एक अजाक्स अनुरोध से प्राप्त हुईं
{
name: "Bob",
address: null
}
नई कार्यक्षमता जो प्रवाह की स्थिति में है। निम्नलिखित रिटर्न शून्य है:
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
}
जावास्क्रिप्ट में कई अलग-अलग नल जांचों की तुलना:
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
अशक्त और अपरिभाषित दोनों मूल्य समानता के लिए झूठे हैं (अशक्त == अपरिभाषित): वे दोनों झूठे झूठ बोलने के लिए पतन करते हैं। वे एक ही वस्तु नहीं हैं (अशक्त! == अपरिभाषित)।
अपरिभाषित वैश्विक ऑब्जेक्ट (ब्राउज़र में "विंडो") की एक संपत्ति है, लेकिन एक आदिम प्रकार है और स्वयं एक वस्तु नहीं है। यह बिना विवरण के चर का डिफ़ॉल्ट मान है और फ़ंक्शन बिना किसी विवरण के समाप्त होता है।
अशक्त वस्तु का एक उदाहरण है। रिक्त तरीकों को इंगित करने के लिए संग्रह वस्तुओं को वापस करने वाले DOM तरीकों के लिए null का उपयोग किया जाता है, जो एक त्रुटि का संकेत दिए बिना एक गलत मान प्रदान करता है।
कुछ प्राथमिकताएँ:
अशक्त और अपरिभाषित हैं दो अलग-अलग मान। एक नाम के लिए एक मूल्य की अनुपस्थिति का प्रतिनिधित्व कर रहा है और दूसरा नाम की अनुपस्थिति का प्रतिनिधित्व कर रहा है।
if
निम्नानुसार क्या होता है if( o )
:
कोष्ठक ओ में अभिव्यक्ति का मूल्यांकन किया जाता है, और फिर if
कोष्ठकों में अभिव्यक्ति के मूल्य को टाइप-कोकरिंग में किक्स - हमारे मामले में o
।
जावास्क्रिप्ट में झूठे (झूठे के लिए मजबूर हो जाएगा) मान हैं: '', अशक्त, अपरिभाषित, 0, और गलत ।
का जवाब देने के लिए जोड़ने के लिए, क्या के बीच differrence है undefined
औरnull
से, जावास्क्रिप्ट निश्चित गाइड 6 संस्करण, इस पृष्ठ पर p.41 :
आप
undefined
सिस्टम-स्तर का प्रतिनिधित्व कर सकते हैं , मूल्य के अनपेक्षित या त्रुटि जैसी अनुपस्थिति काnull
प्रतिनिधित्व कर सकते हैं और मूल्य के कार्यक्रम-स्तर, सामान्य, या अपेक्षित अनुपस्थिति का प्रतिनिधित्व करने के लिए। यदि आपको इनमें से किसी एक मान को एक चर या संपत्ति में निर्दिष्ट करना है या इनमें से किसी एक मान को किसी फ़ंक्शन में पास करना है,null
तो लगभग हमेशा सही विकल्प होता है।
null
एक वस्तु है। इसका प्रकार अशक्त है। undefined
कोई वस्तु नहीं है; इसका प्रकार अपरिभाषित है।
null
और undefined
आदिम मूल्य हैं - typeof null === 'object'
एक भाषा बग है, क्योंकिObject(null) !== null
निम्न कार्य यह दर्शाता है कि अंतर को काम करने में सक्षम क्यों है और सक्षम है:
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
) उपलब्ध है।
उदाहरण के लिए window.someWeirdProperty
अपरिभाषित है, इसलिए
"window.someWeirdProperty === null"
जबकि झूठ का मूल्यांकन करता है
"window.someWeirdProperty === undefined"
सत्य का मूल्यांकन करता है।
इसके अलावा checkif if (!o)
जाँच के समान नहीं है if (o == null)
के लिए o
किया जा रहा है false
।
अपरिभाषित की तुलना में अशक्त के बारे में दूसरी मजेदार बात यह है कि इसे बढ़ाया जा सकता है।
x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0
यह काउंटरों के लिए डिफ़ॉल्ट संख्यात्मक मान सेट करने के लिए उपयोगी है। इसकी घोषणा में आपने कितनी बार एक चर -1 सेट किया है?
इसे देखो:
<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
निकोलस सी। ज़कस द्वारा "प्रिंसिपल्स ऑफ़ ऑब्जेक्ट-ओरिएंटेड जावास्क्रिप्ट" से
लेकिन क्यों एक वस्तु प्रकार शून्य है? (वास्तव में, इसे 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.
'अशक्त' के बारे में सोचने का सबसे अच्छा तरीका यह याद रखना है कि डेटाबेस में समान अवधारणा का उपयोग कैसे किया जाता है, जहां यह इंगित करता है कि किसी फ़ील्ड में "बिल्कुल भी कोई मूल्य नहीं है।"
यह उन प्रोग्रामों को लिखने के लिए एक बहुत ही उपयोगी तकनीक है जो अधिक आसानी से डीबग किए जाते हैं। एक 'अपरिभाषित' चर बग का परिणाम हो सकता है ... (आपको कैसे पता चलेगा?) ... लेकिन यदि चर में मान शून्य है, तो आप जानते हैं कि "कोई व्यक्ति, इस कार्यक्रम में कहीं, इसे सेट करें 'null।' 'इसलिए, मेरा सुझाव है कि, जब आपको किसी वैरिएबल के मूल्य से छुटकारा पाना हो, तो "डिलीट" न करें ... इसे' null 'पर सेट करें। पुराना मूल्य अनाथ हो जाएगा और जल्द ही कचरा एकत्र किया जाएगा; नया मान है, "कोई मूल्य नहीं है (अब)।" दोनों मामलों में, चर की स्थिति निश्चित है: "यह स्पष्ट रूप से, जानबूझकर, इस तरह से मिला है।"
2. अनिश्चित वस्तु एक प्रकार है जबकि नल एक वस्तु है।
3. जावास्क्रिप्ट स्वयं किसी भी अप्रकाशित चर को अपरिभाषित कर सकता है, लेकिन यह अशक्त करने के लिए चर का मान कभी निर्धारित नहीं कर सकता है। इसके लिए प्रोग्राम करना होगा।