JSLint एक मान्य कोड के रूप में इस गुजर नहीं है:वैश्विक चर मौजूद है या नहीं, यह जांचने का सही तरीका क्या है?
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
सही तरीका क्या है?
JSLint एक मान्य कोड के रूप में इस गुजर नहीं है:वैश्विक चर मौजूद है या नहीं, यह जांचने का सही तरीका क्या है?
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
सही तरीका क्या है?
/*global window */
if (window.someVar === undefined) {
window.someVar = 123456;
}
if (!window.hasOwnProperty('someVar')) {
window.someVar = 123456;
}
'/ * वैश्विक विंडो * /' के बजाय, आप '/ * jslint ब्राउज़र का उपयोग कर सकते हैं: true * /'। – XP1
एक ही परिणाम होने के लिए, दूसरा समाधान वास्तव में 'if (! Window.hasOwnProperty (' someVar ') होना चाहिए) ' – Pioul
क्या होगा यदि कोई पृष्ठ आपके सामने इस स्क्रिप्ट को चलाता है:' अपरिभाषित = 'कुछ मान''? –
/**
* @param {string} nameOfVariable
*/
function globalExists(nameOfVariable) {
return nameOfVariable in window
}
इससे कोई फर्क नहीं पड़ता कि आप वर foo या window.foo के साथ एक वैश्विक चर बनाया - वैश्विक संदर्भ में वर के साथ बनाया चर विंडो में लिखा जाता है।
बेशक, आपको फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है, आप बस '' foo का उपयोग कर सकते हैं "विंडो में कहीं भी – gvlasov
हरमएम, जेएसलिंट कहते हैं: 'अप्रत्याशित' में '। अपरिभाषित के साथ तुलना करें, या इसके बजाय hasOwnProperty विधि का उपयोग करें। 'फिर, मुझे लगता है, सही तरीका है: 'window.hasOwnProperty (" nameOfVar ")' – gvlasov
@Susei: jsLint गलत है। '.hasOwnProperty()' दोषपूर्ण है क्योंकि एक वैश्विक हो सकता है जो 'विंडो' की प्रोटोटाइप श्रृंखला को आगे बढ़ाता है। यह अभी भी एक वैश्विक चर है, लेकिन '.hasOwnProperty() 'इसे नहीं देख पाएगा। 'इन' या 'अपरिभाषित' परीक्षण इसे करने का तरीका हैं। –
if (typeof someVar === "undefined") { var someVar = "hi!"; }
जांच करेगा कि someVar
(स्थानीय या वैश्विक) अनिर्धारित रहता है।
आप एक वैश्विक चर के लिए जाँच करना चाहते हैं आप
if(window['someVar'] === undefined) {
...
}
संभालने उपयोग कर सकते हैं यह एक ब्राउज़र :)
कोशिश
variableName in window
या
typeof window[variableName] != 'undefined'
में है
या
window[variableName] !== undefined
या
window.hasOwnProperty(variableName)
क्या आपने JSLint पर इन परीक्षण करने का प्रयास किया था? विंडो में "कुछ वार", "टाइपफ विंडो ['कुछ वार']! == 'अपरिभाषित'", "विंडो ['कुछवार']! == अपरिभाषित" (इसे बिना विंडो में परिवर्तित किए "window.someVar! == अपरिभाषित) जेएसलिंट पर ठीक नहीं हैं। लेकिन वैसे भी, आपके महान उत्तर के लिए धन्यवाद :) –
'ऑब्जेक्ट में' प्रोप "बिल्कुल कानूनी जावास्क्रिप्ट है। याद रखें, जेएसलिंट आपके लिए है, न कि जेएसलिंट के लिए, और जेएसलिंट जावास्क्रिप्ट नहीं है। मेरे लिए 'अगर (ओबीजे में 'प्रोप') {do_it();}' अधिक स्पष्ट है (यानी पठनीय और रखरखाव योग्य), फिर 'if (obj.prop! == अपरिभाषित) {do_it();} '। मैं आपको सुझाव दूंगा इस मामले में जेएसलिंट को अनदेखा करने के लिए। http://stackoverflow.com/questions/6824895/jslint-error-unexpected-in-compare-with-undefined-or-use-the-hasownproperty भी देखें। – kstep
आप बिल्कुल सही हैं लेकिन मैं मेरे कोड जेएसलिंट को वैध रखने के लिए, क्योंकि इसे बनाए रखना आसान है। –
मुझे लगता है कि यह वास्तव में JSLint के साथ एक समस्या है। यह निम्न त्रुटि जारी करेगा:
Unexpected 'typeof'. Compare directly with 'undefined'.
मुझे विश्वास है कि यह बुरी सलाह है। जावास्क्रिप्ट में, undefined
एक वैश्विक चर है जो आमतौर पर, अनिर्धारित है। लेकिन कुछ ब्राउज़र स्क्रिप्ट को इसे संशोधित करने की अनुमति देते हैं, जैसे: window.undefined = 'defined'
। यदि ऐसा है, तो undefined
के साथ सीधे तुलना करने से अप्रत्याशित परिणाम हो सकते हैं। सौभाग्य से, मौजूदा ईसीएमए 5 अनुरूप ब्राउज़र undefined
पर असाइनमेंट की अनुमति नहीं देते हैं (और सख्त मोड में अपवाद फेंक देंगे)।
मैं typeof someVar === "undefined"
पसंद करता हूं, जैसा कि आपने पोस्ट किया है, या someVar in window
सूसेई के सुझाव के अनुसार।
आज विशेष रूप से प्रासंगिक है क्योंकि सभी जेएस ब्राउज़र में नहीं चलेंगे। अगर आप एक लाइब्रेरी लिख रहे हैं तो आप चाहते हैं कि आपका कोड दोनों काम करे ब्राउज़रों के साथ-साथ रनटेम्स जैसे नोडज जहां खिड़की मौजूद नहीं है। –
आप एक वैश्विक चर केवल यदि वह पहले से मौजूद नहीं है आवंटित करने के लिए इच्छुक रहे हैं, तो कोशिश:
window.someVar = window.someVar || 'hi';
या
window['someVar'] = window['someVar'] || 'hi';
यह सबसे सुरुचिपूर्ण और साफ-सुथरा समाधान है। – Christian
bfavaretto सही नहीं है।
किसी मूल्य पर वैश्विक अपरिभाषित सेट अप करने से अपरिभाषित के खिलाफ वस्तुओं का परीक्षण नहीं बदलेगा। JavaScript कंसोल अपने पसंदीदा ब्राउज़रों के लिए इस प्रयास करें:
var udef; var idef = 42;
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".
window.undefined = 'defined';
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".
यह केवल जावास्क्रिप्ट सभी अनदेखी और किसी भी मान अपरिभाषित चर पर सेट किया जा करने का प्रयास किया की वजह से है।
window.undefined = 'defined';
alert(window.undefined); // Alerts "undefined".
आपको किसी अन्य व्यक्ति के उत्तर को अस्वीकार करने के लिए केवल उत्तर अनुभाग का उपयोग नहीं करना चाहिए। यदि आप नहीं सोचते कि किसी अन्य व्यक्ति का उत्तर काम करता है, तो आप उनके उत्तर पर टिप्पणी करते हैं कि आप जिस समस्या को देखते हैं, उसे ठीक कर सकते हैं ताकि वे इसे ठीक कर सकें या प्रश्न के लिए अपना स्वयं का वैध समाधान प्रदान कर सकें। – Scott
यह प्रासंगिक है, लेकिन यह सवाल का जवाब नहीं देता है।मुझे एहसास है कि एक टिप्पणी के रूप में पोस्ट करना बहुत लंबा है, शायद आप अपनी असहमति के नीचे प्रश्न भी _answer_ कर सकते हैं? –
आप मेरे जवाब पर एक टिप्पणी छोड़ सकते थे बस मुझे यह बताने के लिए कि आप असहमत हैं, मैंने केवल आपके जवाब को दुर्घटना से देखा है। आप हमारे "पसंदीदा ब्राउज़र" के बारे में सही हैं, समस्या यह है कि पुराने ब्राउज़र ने इसे रोक नहीं दिया था। मैं इसे और अधिक स्पष्ट करने के लिए अपना उत्तर संपादित करूंगा। – bfavaretto
यह जांच करने का एक आसान तरीका होगा।
लेकिन अगर variableName
घोषित किया जाता है और साथ boolean value: false
if(window.variableName){
}
ध्यान दें कि '' var' if' ब्लॉक के दायरे वाला नहीं है असाइन किया गया है इस चेक विफल हो जाएगा। ऐसा लगता है कि आपने 'if' के ऊपर 'var someVar' लिखा था। रेफरी: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting – leewz