जावास्क्रिप्ट अपरिभाषित अगर एक चर सेट करें


172

मुझे पता है कि मैं एक जावास्क्रिप्ट चर के लिए परीक्षण कर सकता हूं और फिर इसे परिभाषित कर सकता हूं अगर यह अपरिभाषित है, लेकिन क्या कहने का कोई तरीका नहीं है

var setVariable = localStorage.getItem ('मूल्य') || 0;

बहुत स्पष्ट तरीके से लगता है, और मुझे पूरा यकीन है कि मैंने इसे अन्य भाषाओं में देखा है।


30
वह यह है कि नहीं "अपरिभाषित" के लिए एक परीक्षण, यह "falsey" के लिए एक परीक्षण है
एल्निटैक

3
ध्यान दें कि localStorage.getItem()एक अपवाद उपयोगकर्ता विकलांग कुकी होने पर यदि (क्रोम में कम से कम) फेंक होगा, ताकि आप एक के अंदर लपेट कर सकते हैं try...catchखंड
urish

जवाबों:


304

हाँ, यह ऐसा कर सकते हैं, लेकिन सख्ती से बोला कि डिफ़ॉल्ट मान प्रदान करेंगे यदि पुनः प्राप्त मूल्य है falsey के रूप में सही मायने में करने का विरोध किया, अपरिभाषित । इसलिए यह केवल मेल नहीं होगा undefined, लेकिन यह भी null, false, 0, NaN, "" (लेकिन नहीं "0" )।

यदि आप केवल डिफ़ॉल्ट रूप से सेट करना चाहते हैं यदि चर सख्ती से है undefinedतो सबसे सुरक्षित तरीका लिखना है:

var x = (typeof x === 'undefined') ? your_default_value : x;

नए ब्राउज़रों पर यह वास्तव में लिखना सुरक्षित है:

var x = (x === undefined) ? your_default_value : x;

लेकिन ध्यान रखें कि पुराने ब्राउज़रों पर यह संभव नहीं है जहां इसे एक वैरिएबल घोषित करने की अनुमति दी गई है जिसका undefinedएक परिभाषित मूल्य है, जिससे परीक्षण विफल हो जाता है।


3
मुझे आश्चर्य है कि यह पैटर्न अधिक जेएस लिबास में शामिल नहीं है।
joemaller

var x = (x === undefined ? def_val : x);थोड़ी देर के रूप में उपयोग करने के लिए एक नकारात्मक पहलू है var x = (typeof x === 'undefined') ? def_val : x;। क्या व्यवहार अलग है?
मार्को पशकोव

3
पुराने ब्राउज़र में @marco undefinedको फिर से परिभाषित किया जाना संभव था , जिससे समानता परीक्षण विफल हो गया।
अलनीतक

@Alnitak ओपी उपयोग कर रहा है और अभी भी अपरिभाषित के लिए जाँच करने के लिए एक समान वाक्यविन्यास का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?
इवो ​​परेरा

@IvoPereira आप ||अपरिभाषित के लिए एक सख्त परीक्षा में दृष्टिकोण का उपयोग नहीं कर सकते हैं , आपको undefinedसशर्त के साथ एक स्पष्ट परीक्षण का उपयोग करना होगा ।
अलनीतक

26

2018 ES6 का उत्तर है :

return Object.is(x, undefined) ? y : x;

यदि चर x अपरिभाषित है, तो चर y लौटाएं ... अन्यथा यदि चर x परिभाषित किया गया है, तो चर x लौटाएं।


4
जहाँ तक मैं बता सकता हूँ, इस मामले में Object.isकिसी से बेहतर नहीं है ===। "=== ऑपरेटर (और == ऑपरेटर भी) संख्या मानों को 0 और +0 को समान मानता है और नंबर.एनएएन को ना के बराबर मानता है।" ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) यहां कोई फर्क नहीं पड़ता।
ट्रेवर डिक्सन

5
मैं असहमत हूं। उन दोनों को जानें और उपयुक्त का उपयोग करें। विशेष रूप से, उपयोग करें Object.isयदि दोनों ऑपरेंड हो सकते हैं NaN
ट्रेवर डिक्सन

2
यदि Object.is () उपयोग के मामलों के 100% पर काम करता है, और === 98% उपयोग के मामलों पर काम करता है, तो आप === का उपयोग करने का जोखिम क्यों उठाएँगे? उदाहरण के लिए: कंसोल.लॉग (+0 === -0); // आउटपुट सही है, जबकि कंसोल.लॉग (Object.is (+0, -0)); // आउटपुट गलत है - जो बेहतर है? क्या नकारात्मक 0 सकारात्मक 0 के समान है? यह प्रश्न आपको स्वयं से पूछना है, लेकिन यदि आप Object.is () का उपयोग करते हैं, तो आप हमेशा उत्तर जानते हैं। वे समान नहीं हैं, इसलिए असत्य का आउटपुट सही और अपेक्षित परिणाम है।
स्टर्लिंग बॉर्न

2
यहाँ विशेष संदर्भ की तुलना हमेशा की जाती है undefined। तो ===100% समय काम करेगा, न कि केवल 98%। ===यह होने का लाभ पढ़ने में आसान है, विशेष रूप से एक नज़र में, कम और एक अनावश्यक विधि कॉल से बचा जाता है। व्यक्तिगत रूप से मैं केवल तभी उपयोग करूंगा Object.is()जब स्थिति को इसकी आवश्यकता होगी और ===अन्य सभी मामलों में पसंद करेंगे ।
ब्लबरडाइब्लूब

1
पूर्ण रूप से; यदि आप एक अनुभवी कोडर हैं। जब तक आप गलती से एक समान चिन्ह नहीं भूल जाते, जिस स्थिति में डिबगिंग क्यों == कहीं काम नहीं कर रहा है, वह कुछ ऐसा है जो मैं कभी भी किसी डेवलपर पर नहीं चाहूंगा। सॉरी से बेहतर सुरक्षित और हमेशा Object.is () का उपयोग करें, इसका कारण यह था कि विशेष रूप से डेवलपर्स को कम बग्गी कोड लिखने में मदद करने के लिए कल्पना में शामिल किया गया था।
स्टर्लिंग बॉर्न

7

मुझे कई स्थानों पर "अपरिभाषित होने पर एक चर सेट करने" की आवश्यकता थी। मैंने @Alnitak उत्तर का उपयोग करके एक फ़ंक्शन बनाया। उम्मीद है कि यह किसी की मदद करता है।

function setDefaultVal(value, defaultValue){
   return (value === undefined) ? defaultValue : value;
}  

उपयोग:

hasPoints = setDefaultVal(this.hasPoints, true);

6

इसके typeofबजाय जाँच करना अधिक तर्कसंगत लगता है undefined? 0जब आप अपरिभाषित होने पर var सेट करते हैं तो मैं आपसे एक संख्या की उम्मीद करता हूं :

var getVariable = localStorage.getItem('value');
var setVariable = (typeof getVariable == 'number') ? getVariable : 0;

इस स्थिति में यदि getVariableकोई संख्या (स्ट्रिंग, ऑब्जेक्ट, जो कुछ भी) नहीं है, setVariable को सेट किया गया है0


5

ES2020 उत्तर

साथ Nullish वालों ऑपरेटर, आप एक डिफ़ॉल्ट मान सेट कर सकते हैं, तो valueनल या अनिर्धारित रहता है।

const setVariable = localStorage.getItem('value') ?? 0;

हालाँकि, आपको इस बात की जानकारी होनी चाहिए कि अन्य प्रकार के फर्जी मूल्य जैसे 0और के लिए nullish coalescing संचालक डिफ़ॉल्ट मान नहीं लौटाता है ''

ध्यान रखें कि ऑपरेटर के लिए ब्राउज़र समर्थन सीमित है। कैनीयूज़ के आंकड़ों के अनुसार , केवल 48.34% ब्राउज़र समर्थित हैं (अप्रैल 2020 तक)। Node.js का समर्थन संस्करण 14 में जोड़ा गया था ।


2

यदि आप एक FP ( कार्यात्मक प्रोग्रामिंग ) प्रशंसक हैं, तो Ramda के लिए एक डिफ़ॉल्ट सहायक फ़ंक्शन है जिसे डिफॉल्टो कहा जाता है :

उपयोग:

const result = defaultTo(30)(value)

undefinedबूलियन मूल्यों के साथ काम करते समय यह अधिक उपयोगी है :

const result2 = defaultTo(false)(dashboard.someValue)


1
यह ठीक है const result = value || 30;, सिवाय एक के बीच समारोह और +1000 बाइट्स lib का उपयोग कर रहा है
Adelin

1
@ एडेलिन सच नहीं है, यह बूलियन प्रकारों के लिए झूठा संभालता है। यदि आप पहले से ही इस परिवाद का उपयोग कर रहे हैं (जैसा कि मैं कर रहा हूँ) तो यह बहुत उपयोगी है, और इसका मतलब है
दामियन ग्रीन

1

var setVariable = (typeof localStorage.getItem('value') !== 'undefined' && localStorage.getItem('value')) || 0;


0 localStorage.getItem('value'))रिटर्न होने पर भी इस्तीफा नहीं देंगेfalse
कार्ल एडलर

1

इस परिदृश्य में आज भी भाग गया जहाँ मैं नहीं चाहता था कि शून्य को कई मूल्यों के लिए अधिलेखित किया जाए। हमारे पास इस तरह के परिदृश्यों के लिए कुछ सामान्य उपयोगिता विधियों के साथ एक फ़ाइल है। यहां मैंने परिदृश्य को संभालने और लचीले होने के लिए जोड़ा।

function getIfNotSet(value, newValue, overwriteNull, overwriteZero) {
    if (typeof (value) === 'undefined') {
        return newValue;
    } else if (value === null && overwriteNull === true) {
        return newValue;
    } else if (value === 0 && overwriteZero === true) {
        return newValue;
    } else {
        return value;
    }
}

इसे तब अंतिम दो मापदंडों के साथ वैकल्पिक कहा जा सकता है यदि मैं केवल अपरिभाषित मूल्यों के लिए सेट करना चाहता हूं या अशक्त या 0 मानों को अधिलेखित करना चाहता हूं। यहां एक कॉल इसका उदाहरण है जो ID को -1 पर सेट करेगा यदि ID अपरिभाषित या अशक्त है, लेकिन 0 मान को अधिलेखित नहीं करेगा।

data.ID = Util.getIfNotSet(data.ID, -1, true);

1

हमारे दिनों में आप वास्तव में JS के साथ अपना दृष्टिकोण कर सकते हैं:

// Your variable is null
// or '', 0, false, undefined
let x = null;

// Set default value
x = x || 'default value';

console.log(x); // default value

तो आपका उदाहरण काम करेगा:

const setVariable = localStorage.getItem('value') || 0;


0

यह मुझे लगता है, कि वर्तमान जावास्क्रिप्ट कार्यान्वयनों के लिए,

var [result='default']=[possiblyUndefinedValue]

ऐसा करने का एक अच्छा तरीका है (ऑब्जेक्ट डिकंस्ट्रक्शन का उपयोग करके)।


0

तार्किक nullish असाइनमेंट, ES2020 + समाधान

नए ऑपरेटर फिलहाल ब्राउज़रों, जोड़े जा रहे हैं ??=, ||=और &&=। इस पोस्ट पर ध्यान दिया जाएगा ??=

यह जांचता है कि यदि बाईं ओर अपरिभाषित या अशक्त है, तो पहले से ही परिभाषित होने पर शॉर्ट-सर्कुलेटिंग। यदि नहीं, तो दाईं ओर बाईं ओर चर को सौंपा गया है।

तुलना करने के तरीके

// Using ??=
name ??= "Dave"

// Previously, ES2020
name = name ?? "Dave"

// Before that (not equivalent, but commonly used)
name = name || "Dave" // name ||= "Dave"

मूल उदाहरण

let a          // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

// Equivalent to
a = a ?? true

ऑब्जेक्ट / एरे उदाहरण

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

?? = ब्राउज़र समर्थन जुलाई 2020 - .03%

?? = मोज़िला प्रलेखन

|| = मोज़िला दस्तावेज़

&& = मोज़िला प्रलेखन


क्या वास्तव में दो अन्य प्रश्नों के इस उत्तर को कॉपी करना एक अच्छा विचार है ( एक मान को बदलें यदि जावास्क्रिप्ट में अशक्त या अपरिभाषित है और क्या जावास्क्रिप्ट में "अशक्त सहूलियत" ऑपरेटर है? )। यह टिप्पणी में संबंधित प्रश्नों के डुप्लिकेट या लिंक के रूप में VTC के लिए बेहतर नहीं होगा?
user4642212

प्रश्न सभी थोड़े अलग हैं; जैसे कि उत्तर हैं। उदाहरण एक नज़र में इनलाइन संदर्भ को बेहतर बनाने के लिए अनुकूल हैं। संभवतः अधिक विवरण के लिए लिंक किया जा सकता था, लेकिन एक अतिरिक्त आशा की आवश्यकता होती है जो लोगों को समाधान छोड़ने का कारण बन सकता है
गिबोल्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.