ජාවාස්ක්‍රිප්ට් හි නිර්වචනය නොකළ විචල්‍යයක් පරීක්ෂා කරන්නේ කෙසේද


923

විචල්‍යය නිර්වචනය කර තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට මට අවශ්‍ය විය. උදාහරණයක් ලෙස, පහත දැක්වෙන්නේ නිර්වචනය නොකළ දෝෂයකි

alert( x );

මෙම දෝෂය මා හඳුනා ගන්නේ කෙසේද?




1
මෙය සලකුණු කළ අනුපිටපතෙහි අනුපිටපතක් නොවේ. විචල්ය විභේදනය සහ වස්තු දේපල විසර්ජනය බෙහෙවින් වෙනස් ය. වඩා හොඳ අනුපිටපතක් යනු ජාවාස්ක්‍රිප්ට් හි විචල්‍යයක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද? .
RobG

ඔබේ දෝෂයට හේතුව විචල්‍යය ප්‍රකාශ නොකිරීමයි. බොහෝ පිළිතුරු යොමු වී ඇත්තේ පැවරුම මත ය. වැඩි විස්තර සඳහා මගේ පිළිතුර බලන්න . මීට අමතරව, ඔවුන්ගෙන් බොහෝ දෙනෙක් ජාවාස්ක්‍රිප්ට් හි ඇති ශුන්‍ය හා නිර්වචනය නොකළ වස්තූන් බව වැරදි ලෙස ප්‍රකාශ කරති. ඒවා ප්‍රාථමිකයන් මිස වස්තූන් නොවේ ...
ජේබලින්

Answers:


1701

JavaScript හි, nullවස්තුවකි. නොපවතින දේවල් සඳහා තවත් වටිනාකමක් තිබේ , undefined. nullලේඛනයේ යම් ව්‍යුහයක් සොයා ගැනීමට අපොහොසත් වූ සෑම අවස්ථාවකම පාහේ DOM නැවත පැමිණේ , නමුත් ජාවාස්ක්‍රිප්ට් තුළම undefinedභාවිතා වන අගය වේ.

දෙවනුව, නැත, සෘජු සමානකමක් නොමැත. ඔබට නිශ්චිතවම පරීක්ෂා කිරීමට අවශ්‍ය නම් null, කරන්න:

if (yourvar === null) // Does not execute if yourvar is `undefined`

ඔබට විචල්‍යයක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නම්, එය කළ හැක්කේ try/ සමඟ පමණි catch, මන්ද typeofඑය ප්‍රකාශයට පත් නොකළ විචල්‍යයකට සහ undefinedසමාන අගයකින් ප්‍රකාශිත විචල්‍යයකට සලකනු ඇත.

එහෙත්, Variable එකක් නම්, පරීක්ෂා කිරීමට හා නොවේ undefined:

if (yourvar !== undefined) // Any scope

මීට පෙර, typeofනිර්වචනය නොකළ ආරක්ෂිතව පරීක්ෂා කිරීම සඳහා ක්‍රියාකරු භාවිතා කිරීම අවශ්‍ය විය , මන්ද එය undefinedවිචල්‍යයක් මෙන් නැවත පැවරිය හැකි බැවිනි . පැරණි ක්‍රමය මේ ආකාරයට විය:

if (typeof yourvar !== 'undefined') // Any scope

යන ප්රශ්නය undefinedනැවත assignable වීම සම්මතයන් 5, 2009 දැන් ඔබට ආරක්ෂිතව භාවිතා කළ හැක නිකුත් කරන ලද ස්ථාවර විය ===හා !==පරීක්ෂණ සඳහා undefinedභාවිතා නොකර typeofලෙස undefinedකියවීමට පමණක් ඇති යම් කාලයක් සඳහා.

සාමාජිකයෙකු ස්වාධීනව සිටීදැයි දැන ගැනීමට ඔබට අවශ්‍ය නම් එහි වටිනාකම කුමක් දැයි සැලකිලිමත් නොවන්න:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

විචල්‍යයක් සත්‍යයක් දැයි දැන ගැනීමට ඔබට අවශ්‍ය නම් :

if (yourvar)

මූලාශ්රය


71
නිර්වචනය කර ඇත්තේ වෙන් කළ වචනයක් නොවේ; ඔබට (හෝ වෙනත් කෙනෙකුගේ කේතයකට) "නිර්වචනය නොකළ = 3" කළ හැකි අතර එය ඔබගේ පරීක්ෂණ දෙකක් බිඳ දමනු ඇත.
ජේසන් එස්

6
"විචල්‍යය පවතින බව ඔබ දන්නා නමුත් එහි කිසියම් වටිනාකමක් තිබේදැයි නොදනී" - හාහ්?!
ජේසන් එස්

36
මම හිතන්නේ ඔහු යොමු කර නැති විචල්‍යයක් ගැන සඳහන් කරයි. උදා: var foo; // foo පවතින නමුත් එහි වටිනාකමක් නැත
Wally Lawless

3
හ්ම් ... මම "මූලාශ්‍ර" සබැඳිය දුටුවෙමි: මෙම සම්පූර්ණ ලිපියම තැපැල් ලැයිස්තුවෙන් සෘජු උපුටා දැක්වීමක් වන අතර, එය වඩාත් පැහැදිලි කිරීම සඳහා සංස්කරණය කළ යුතුය, මුල් කතුවරයා පැහැදිලි කිරීමට නොමැති නිසා.
ජේසන් එස්

11
"ජාවාස්ක්‍රිප්ට් ශුන්‍යය යනු වස්තුවකි.", එය ඇත්ත වශයෙන්ම සත්‍ය නොවන අතර බොහෝ විට මෙම වැරදි වැටහීමේ වැරදිකරු වන්නේ typeofක්‍රියාකරු ( typeof null == 'object') ය. මෙම nullඅගය යනු ප්රාථමික අගය වන එකම අගය වන, NULL වර්ගය .
සීඑම්එස්

353

විචල්‍යයක් නම් සත්‍ය වශයෙන්ම පරීක්ෂා කිරීමට ඇති එකම ක්‍රමය undefinedපහත සඳහන් දේ කිරීමයි. මතක තබා ගන්න, නිර්වචනය කිරීම ජාවාස්ක්‍රිප්ට් හි වස්තුවකි.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

මෙම ත්‍රෙඩ් එකේ ඇති වෙනත් විසඳුම් සමහරක් විචල්‍යයක් නිර්වචනය කර ඇතත් එය නිර්වචනය කර නොමැති බව විශ්වාස කිරීමට ඔබව පොළඹවනු ඇත (උදාහරණයක් ලෙස NULL හෝ 0 අගය සමඟ).


18
ප්‍රශ්නය නිර්වචනය කර නොමැති නිසා මෙහි යම්කිසි වර්ගයක් තිබිය යුතුය! == 'නිර්වචනය නොකළ', හරිද?
eomeroff

1
ඇත්තටම, මම හිතන්නේ නැහැ undefinded වස්තුවක් එසේ බව නැහැ, චෙක් ප්රලේඛනය පළමු developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus

2
නිෂ්පාදනය නොකරන එකම පරීක්ෂණය a ReferenceError.
Nostalg.io

2
මෙම කේතය නිවැරදි ය, නමුත් මම සිතන්නේ undefinedජාවාස්ක්‍රිප්ට් හි වස්තුවක් යැයි පැවසීම වැරදි තොරතුරු ය. මෙම ප්‍රකාශය කෙසේ හෝ ඔබගේ පිළිතුරට සම්බන්ධද? එය undefinedවර්ගයේ අගයක් වන අතර එය නම් undefinedකර ඇති ගෝලීය අනන්‍යතාවයට පවරා ඇත undefined.
SimplGy

1
මෙය එකම ක්‍රමය වීම නිසා මෙය දැන් වැරදිය. undefinedES5 සිට කියවීමට පමණි. මේ ආකාරයට කෙටිකාලීන භාවිතා කිරීම if (x === undefined) {...}හෝ භාවිතා කිරීම සඳහා ඔබට ආරක්ෂිතව පරීක්ෂා කළ හැකිය : if (x === void 0).
ස්ටීවන් එම් ඉර්වින්

66

තාක්ෂණික වශයෙන්, නිසි විසඳුම වන්නේ (මම විශ්වාස කරමි):

typeof x === "undefined"

ඔබට සමහර විට කම්මැලි වී භාවිතා කළ හැකිය

x == null

නමුත් එමඟින් නිර්වචනය නොකළ විචල්‍ය x සහ ශුන්‍ය අඩංගු විචල්‍ය x යන දෙකටම සත්‍යය නැවත ලබා ගත හැක.


1
ඔබ ටයිප් නම් var x;පසුව typeof x;ඔබට ලැබෙනු ඇත "undefined"ඔබ කළාක් නම් වගේtypeof lakjdflkdsjflsj;
මුහම්මද් ඉද්දමල්ගොඩ

එබැවින් නිර්වචනය නොකළ නමුත් ප්‍රකාශිත විචල්‍යය පරීක්ෂා කිරීමට ක්‍රමයක් නොමැතිද?
මුහම්මද් උමර්

1
මම හිතන්නේ නැහැ; ඔබට අවශ්‍ය ඇයිදැයි මට විශ්වාස නැත.
ජේසන් එස්

ujndefined apices අතර නොවිය යුතුය
LowFieldTheory

අභියාචනා වලින් ඔබ අදහස් කරන්නේ කුමක්ද?
ජේසන් එස්

19

ඊටත් වඩා පහසු හා කෙටිමං අනුවාදයක් වනුයේ:

if (!x) {
   //Undefined
}

හෝ

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
x ක්‍රියාකාරී ඇමතුමකින් සකසන්නේ නම් පළමු කේත කෑල්ල වැරදිය. x = A () වැනි; A කිසිවක් ආපසු ලබා නොදෙන්නේ නම්, එය පෙරනිමියෙන් "නිර්වචනය නොකළ" යවනු ඇත. ! X කිරීම සත්‍යයක් වන අතර එය තර්කානුකූලව නිවැරදි වනු ඇත. කෙසේ වෙතත්, A () 0 ආපසු එන්නේ නම්! X x = 0 ලෙස ව්‍යාජ විය යුතුය. කෙසේ වෙතත් JS හි! 0 ද සත්‍ය වේ.
රාජත්

දෙවන කේතය කෙටි කළ හැකිය: if (! typeof (XX)) {...} else {...}
Alejandro Silva

2
Lea ඇලෙජැන්ඩ්‍රෝසිල්වා ප්‍රමාද පිළිතුරු සඳහා කණගාටුයි. ටයිප්අෆ් විසින් නූලක් ලබා දෙන බැවින් එය ක්‍රියා නොකරනු ඇත, එබැවින් එය නිර්වචනය නොකළ විචල්‍යයක් සඳහා 'නිර්වචනය නොකළ' ලෙස ආපසු එනු ඇත, එමඟින් එය සත්‍යය ලෙස ඇගයීමට ලක් කරනු ඇත.
දිමිත්‍රි ෆාර්කොව්

5
කරුණාකර පළමු ස්නිපටය ඉවත් කරන්න, එය නරකයි
ජුවාන් මෙන්ඩිස්

1
වෙනත් අදහස් දැක්වීම් මගින් පළමු උදාහරණය නරක යැයි පෙන්වා දී ඇතත් එයට හේතුව පැහැදිලි නැත. එබැවින්, ඕනෑම නව කෝඩරයක් සඳහා :! X යනු x යන්න නිර්වචනය කර ඇත්ද, නමුත් එය සත්‍යද යන්න පරීක්ෂා නොකරයි. නූල්, බූලියන් සත්‍ය සහ ධනාත්මක සංඛ්‍යා සියල්ලම සත්‍ය වේ (මට සමහර දේවල් අමතක විය හැකිය), නමුත් 0, බූලියන් අසත්‍යය සහ හිස් නූලක් වැනි වෙනත් වලංගු අගයන් සත්‍ය නොවේ. පළමු උදාහරණයට විශේෂිත භාවිත අවස්ථා සඳහා ක්‍රියා කළ හැකිය (උදා: ඔබට නිර්වචනය නොකළ ආකාරයට හිස් ලෙස සැලකිය හැකි නම් නූලක් පරීක්ෂා කිරීම), නමුත් බොහෝ විට එය සිදු නොවන නිසා එය පරීක්ෂා කිරීමේ පෙරනිමි ක්‍රමය ලෙස නොසැලකිය යුතුය.
cfc

16

මම බොහෝ විට කර ඇත:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
"==" යන්න "===" ලෙස වෙනස් කිරීම සලකා බලන්න. ඔබ doSomething (null) අමතන්නේ නම් ඔබට ද අනතුරු ඇඟවීම ලැබෙනු ඇත. එය ඔබට අවශ්‍ය නම් මිස.
ජේසන් එස්

ඔව්. ඔබට සමාන හෝ හරියටම සමානද යන්න තීරණය කළ යුතුය. එක්කෝ නඩුව භාවිතා කළ හැකිය.
ජෝ

1
සරලවම මේ ආකාරයට පරීක්ෂා කරන්න-> if (typeof variableName! == 'undefined') {alert (variableName);}
මුහම්මද් සාදික්

ඔබට කිසිසේත් නිර්වචනය නොකළ var එකක් ශ්‍රිතයකට යැවිය නොහැකි බැවින් මෙය
avalanche1

2
ඔබට හැකි බව විශ්වාසයි. තර්කයක් නොමැති ශ්‍රිතයක් ඇමතීමට උත්සාහ කරන්න.
ජෝ

3

ඔබට ත්‍රිමාණ කොන්දේසි සහිත ක්‍රියාකරු භාවිතා කළ හැකිය:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


එසේ නම් කුමක් කළ var a = false;යුතුද? ඒ a===undefinedවෙනුවට ඔබ එය පරීක්ෂා කර බැලිය යුතුය
Iter Ator

1
ප්‍රශ්නය: නිර්වචනය නොකළ විචල්‍යයක් පරීක්ෂා කරන්න ..... මෙය නිර්වචනය නොකළ විචල්‍යයකි: var x; ඉහත කිරීමෙන් දෝෂයක් ඇති වේ
මුහම්මද් උමර්

"A = අසත්ය නම්, එය පෙන්වනු ඇත" මම නොදනිමි 'a' "" - එයයි ගැටලුව, ප්‍රශ්නය එය නිර්වචනය කර ඇත්දැයි පරීක්ෂා කිරීම මිස එය සත්‍යයක්ද යන්න නොවේ. A යනු අසත්‍යයක් ලෙස අර්ථ දැක්වුවහොත්, a යන්න නිර්වචනය නොකෙරේ. මෙය එම අවස්ථාවේ වැරදි ප්‍රති result ලය ලබා දෙයි. මෙම ප්‍රවේශය ක්‍රියාත්මක නොවන්නේ මන්ද යන්න පිළිබඳ වැඩි විස්තර සඳහා stackoverflow.com/a/858270/2055492 පිළිබඳ මගේ අදහස බලන්න .
cfc

පමණක් නොව !aසැබෑ පරීක්ෂා undefined, එය ද සැබෑ පරීක්ෂා 0හා nullහා false. මෙය ඉතා වැරදි වන අතර එය ඉවත් කළ යුතුය.
ස්ටීවන් එම් ඉර්වින්

3

දෝෂය ඔබට xනොපවතින බව ඔබට කියයි ! එය ප්‍රකාශයට පත් කර නැත , එය වටිනාකමක් පැවරීමට වඩා වෙනස් ය .

var x; // declaration
x = 2; // assignment

ඔබ ප්රකාශ නම් x, ඔබ දෝෂයක් ලබා ගැනීමට නොහැකි වනු ඇත. ඔබ පවසන අනතුරු ඇඟවීමේ ලබා ගත හැකි බව undefinedනිසාxපවතින / ප්‍රකාශ කර ඇති නමුත් වටිනාකමක් ඇත.

විචල්‍යය ප්‍රකාශයට පත් කර ඇත්දැයි පරීක්ෂා කිරීම සඳහා, ඔබට භාවිතා කළ හැකිය, විචල්‍යයක් තිබේදැයි පරීක්ෂා typeofකිරීමේ වෙනත් ක්‍රමයක් ඔබට මුලින් ඇති වූ දෝෂය මතු කරයි.

if(typeof x  !==  "undefined") {
    alert(x);
}

මෙය ගබඩා කර ඇති අගය වර්ගය පරීක්ෂා කරයි x. එය පමණක් ආපසු undefinedවිට xප්රකාශ කර නැත කර හෝ එය නම් කර ඇත ප්රකාශයට පත් කර තවමත් යොදවා නොමැති.


ES5 (2009 නිකුතුව) සිට නිර්වචනය කර ඇත්තේ කියවීමට පමණි, ඔබට තවදුරටත් typeofක්‍රියාකරු අවශ්‍ය නොවේ .
ස්ටීවන් එම් ඉර්වින්

2

මම බොහෝ විට සරලම ක්‍රමය භාවිතා කරමි:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

සංස්කරණය කරන්න:

විචල්‍යය ආරම්භ නොකර, ව්‍යතිරේකය විසි කරනු ලැබේ "නොකැඩූ යොමු දෝෂය: විචල්‍යය අර්ථ දක්වා නැත ..."


2
Uncaught ReferenceError: variable is not defined
මුහම්මද් උමර්

U මුහම්මද් උමර්, වැරදියි! variableමගින් අර්ථ දක්වා ඇත var variable;. මෙම ස්නිපටය variableදේශීය විෂය පථය අභිබවා යනු ඇත. එය වසා දැමීමකට හෝ ගෝලීය විචල්‍යයකට ප්‍රවේශ වීමට අපේක්ෂා කරන තර්කනය බිඳ දැමිය හැකිය. එනම්:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев

2

තවත් විභව “විසඳුමක්” භාවිතා කිරීම window වස්තුව . එය බ්‍රව්සරයක සිටින විට යොමු දෝෂ ගැටළුව මඟහරවා ගනී.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

මෙය මුල් ප්‍රශ්නය කිසිසේත් විසඳන්නේ නැති අතර එය සම්පූර්ණයෙන්ම අදාල නොවේ. යම් දෙයක් සත්‍ය හෝ අසත්‍යයක් දැයි පරීක්ෂා කරන්නේ කෙසේදැයි පෝස්ටර් විමසුවේ නැත undefined. මෙය එසේ නොකරනු ඇත.
ස්ටීවන් එම් ඉර්වින්

2

මෙම voidක්රියාකරු ප්රතිලාභ undefinedඑය සම්මත කිසිදු තර්කයක් / ප්රකාශනය සඳහා. එවිට ඔබට ප්‍රති result ලයට එරෙහිව පරීක්ෂා කළ හැකිය (ඇත්ත වශයෙන්ම සමහර මිනිෆයර් ඔබේ කේතය සිට වෙනස් undefinedකරයිvoid 0 චරිත කිහිපයක් බේරා ගැනීමට)

උදාහරණයක් වශයෙන්:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

ඩිං ඩිං! මෙය නිවැරදි පිළිතුරයි. ලැජ්ජයි එය පතුලේ ඇති සියල්ලම. සෑම කෙනෙකුම තවමත් භාවිතා කරමින් සිටින typeofඅතර සිතීම undefinedනැවත පැවරිය හැකිය, එය දශකයක් පමණ ගත වී නැත.
ස්ටීවන් එම් ඉර්වින්

ES5 ට පෙර මෙයද ආරක්ෂිත විය. මන්දයත් ඔබ නැවත undefinedපත් කර තිබුණද , දෙවියන් වහන්සේ දන්නේ කුමන හේතුවක් නිසාද යන්න භාවිතා කිරීම void 0සැමවිටම undefinedනොසලකා හරිනු ඇත.
ස්ටීවන් එම් ඉර්වින්

1

අපට undefinedපහත පරිදි පරීක්ෂා කළ හැකිය

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

පහත වැනි දෙයක් කරන්න:

function isNotDefined(value) {
  return typeof value === "undefined";
}

එය මෙසේ අමතන්න:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

පිළිගත් පිළිතුර නිවැරදි ය. තවත් එක් විකල්පයක් එක් කිරීමට අවශ්‍ය විය. try ... catchමෙම තත්වය පාලනය කිරීම සඳහා ඔබට බ්ලොක් භාවිතා කළ හැකිය. විකාර උදාහරණයක්:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

catchබ්ලොක් මට්ටමේ විෂය පථයක් නිර්මාණය කරන බැවින් එය තරමක් අවුල් සහගත වන බ්ලොක් ගැන සැලකිලිමත් වන්න . ඇත්ත වශයෙන්ම, අසන ලද ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා උදාහරණය අතිශයින්ම සරල කර ඇත, එය දෝෂ හැසිරවීමේ හොඳම භාවිතයන් ආවරණය නොකරයි;).


0

විචල්‍යයක් ප්‍රකාශයට පත් කර ඇති බව තහවුරු කර ගැනීම සඳහා මම කුඩා ශ්‍රිතයක් භාවිතා කරමි, එය ඇත්ත වශයෙන්ම මගේ ජාවාස්ක්‍රිප්ට් ලිපිගොනු වල ඇති කැළඹිලි ප්‍රමාණය අඩු කරයි. විචල්‍යය පවතිනවා පමණක් නොව, වටිනාකමක් ද ලබා දී ඇති බව තහවුරු කර ගැනීම සඳහා මම අගය සඳහා චෙක්පතක් එක් කරමි. දෙවන කොන්දේසිය මඟින් විචල්‍යය ද ක්ෂණිකව ක්‍රියාත්මක කර ඇත්දැයි පරීක්ෂා කරයි, මන්ද විචල්‍යය නිර්වචනය කර ඇති නමුත් ක්ෂණිකව ක්‍රියාත්මක නොවන්නේ නම් (පහත උදාහරණය බලන්න), ඔබ ඔබේ කේතයේ වටිනාකම සඳහන් කිරීමට උත්සාහ කළහොත් එය තවමත් දෝෂයක් ඇති කරයි.

var my_variable;ක්ෂණිකව නොවේ - ක්ෂණික -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

එවිට ඔබට විචල්යය නිර්වචනය කර ඇති බවත්, ක්ෂණිකව මේ ආකාරයෙන් ක්ෂණික කර ඇති බවත් පරීක්ෂා කිරීමට ඔබට කොන්දේසි සහිත ප්‍රකාශයක් භාවිතා කළ හැකිය ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

හෝ එය නිර්වචනය කර නොමැති බවත්, ක්ෂණිකව භාවිතා කර ඇති බවත් පරීක්ෂා කිරීමට ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
ඔබේ අනාවැකිය වහාම ආපසු නොයන්නේ ඇයි? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.