ජාවාස්ක්‍රිප්ට් විචල්‍යය තිබේදැයි පරීක්ෂා කරන්න (අර්ථ දක්වා ඇත / ආරම්භ කර ඇත)


1802

විචල්‍යයක් ආරම්භ කර ඇත්දැයි පරීක්ෂා කිරීමේ ක්‍රමය වඩා හොඳ / නිවැරදිද? (විචල්‍යයට ඕනෑම දෙයක් රඳවා ගත හැකි යැයි උපකල්පනය කළහොත් (string, int, object, function, etc.))

if (elem) { // or !elem

හෝ

if (typeof(elem) !== 'undefined') {

හෝ

if (elem != null) {

5
fooප්‍රකාශයට පත් කර ඇත්දැයි දැන ගැනීමට ඔබට අවශ්‍ය නම් , typeof foo === 'undefined'හෝtypeof foo === typeof undefined

1
ඉහළ නංවා ඇති පිළිතුරු ප්‍රකාශිත නමුත් වටිනාකම ඇති විචල්‍යයන් සඳහා ක්‍රියා නොකරයි undefined. නිවැරදි පිළිතුර මෙයයි: stackoverflow.com/a/36432729/772035
පෝල්

APaulpro, භාවිතා කරන අනුවාදයේ hasOwnProperty('bar')අනෙක් ඒවාට සමාන අඩුපාඩු නොමැත, නමුත් Node සඳහා යම් වෙනස් කිරීමක් අවශ්‍ය වේ (ප්‍රතිස්ථාපනය windowකරන්න global).
ඔලිගෝෆ්‍රන්

APaulpro ඇත්ත වශයෙන්ම, නමුත් ඔබ පිළිතුරු දීමට පෙර මම කල්පනා කරමින් සිටියදී, මම නිගමනය කළේ එය සැබවින්ම ප්‍රායෝගික ගැටළුවක් නොවන බවයි. ඔබ වාරණ හෝ ක්‍රියාකාරී විෂය පථ විචල්‍යයන් සමඟ කටයුතු කරන විට, එය සාමාන්‍යයෙන් ඔබ සතුව ඇති කේතයක් හෝ ලිඛිත ප්‍රවේශයක් ඇත, එබැවින් ඔබට නිවැරදි කළ හැකි ඕනෑම අවස්ථාවක ධාවන කාල දෝෂයක් ඇතිවේ. විචල්යයන් සමඟ සුපුරුදු ගැටළුව නිර්වචනය කර නොමැති (නොපවතින) සාමාන්යයෙන් ඔබේ පාලනයෙන් බැහැර කේතයක් තුළ පවතින බැවින් ඔබට එය හඳුනා ගැනීමේ ක්රමයක් අවශ්ය වේ. එබැවින් එය 80/20 විසඳුමයි.
ඔලිගෝෆ්‍රන්

Answers:


3097

ඔබට අවශ්ය වන typeofක්රියාකරු . විශේෂයෙන්:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
මෙය හොඳ විසඳුමක් ලෙස පෙනේ, නමුත් මෙය ක්‍රියාත්මක වන්නේ මන්දැයි ඔබට පැහැදිලි කළ හැකිද?
මෝගන් චෙං

46
ඇත්ත වශයෙන්ම, වස්තුව ඔබට අවශ්‍ය වන්නේ එයදැයි ඔබ පරීක්ෂා කළ යුතුය. (Typeof console == 'object') {// විචල්‍යය නම් මට එය අවශ්‍ය වන්නේ නම් එය එසේ වනු ඇත
stat

59
E ජෝර්ජ් IV: "විචල්ය නම්" කරන්න "- ම්, නැත, එය අසත්ය සහ 0 අසමත් වේ.
ජේසන් එස්

17
'if (විචල්‍යය)' ද වස්තු ගුණාංගවල පැවැත්ම පරීක්ෂා කිරීම සඳහා අසමත් වේ.
ස්කොට්ස්

54
@ geowa4 ඇත්ත වශයෙන්ම, විචල්‍යය නිර්වචනය කර නොමැති නම් එය දෝෂයක් ඇති කරයි.
kevinji

862

මෙම typeofවිචල්ය ඇත්තටම නිර්වචනය නොකළ නම් ක්රියාකරු පරීක්ෂා කරනු ඇත.

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

මෙම typeofක්රියාකරු, අනෙක් සමාගම් මෙන් නොව, එය විසි කරන්නේ නැත ReferenceError ක අප්රසිද්ධ විචල්ය භාවිත කරන විට හැර.

කෙසේ වෙතත්, එය typeof nullනැවත පැමිණෙන බව සලකන්න "object". වෙත විචල්‍යයක් ආරම්භ කිරීමේ වැරැද්ද වළක්වා ගැනීමට අප පරෙස්සම් විය යුතුය null. ආරක්ෂිත වීමට, ඒ වෙනුවට අපට භාවිතා කළ හැක්කේ මෙයයි:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

===සරල සමානාත්මතාවය වෙනුවට දැඩි සංසන්දනයක් භාවිතා කිරීම පිළිබඳ වැඩි විස්තර සඳහා ==, බලන්න:
ජාවාස්ක්‍රිප්ට් සැසඳීම් වලදී භාවිතා කළ යුතු සමාන ක්‍රියාකරු (== vs ===)?


2
if (! variable_here) {// ඔබේ කේතය මෙහි ඇත. }; විචල්‍යය
අසත්‍යද

5
if(! variable_here)බොහෝ අවස්ථාවන්හිදී බිඳී යනු ඇත. විචල්‍යය 0 හෝ අසත්‍ය නම් එය අසාර්ථක වනු ඇත. ඔබට අවශ්‍ය දේ එය නොවේ.
කෝරි ඩැනියෙල්සන්

2
මේ සඳහා ඡන්දය ප්‍රකාශ කළ යුතුද යන්න තීරණය කළ නොහැක. තදින් කථා typeof foo === "undefined"කිරීම නිවැරදි වන අතර ඉහළ ඡන්දය දුන් පිළිතුරට වඩා හොඳය, නමුත් අතිරේක සටහන් මෙම පිළිතුර ව්‍යාකූල කරයි.
අල්නිටැක්

1
Te ස්ටීවන්පෙනී කාලරාමුව පරීක්ෂා කරන්න. මෙම පිළිතුර පළ කිරීමෙන් පසු ඉහළම පිළිතුර වෙනත් ප්‍රශ්නයකින් ඒකාබද්ධ කරන ලදි
රොබ්

1
මෙම පිළිතුර ක්‍රියාත්මක නොවේ. මෙහි ක්‍රියාත්මක වන එකම පිළිතුර මෙයයි: stackoverflow.com/a/36432729/772035
පෝල්

231

බොහෝ අවස්ථාවලදී, භාවිතා කිරීම:

if (elem) { // or !elem

ඔබ වෙනුවෙන් එම කාර්යය කරනු ඇත! ... මෙය පහත සඳහන් අවස්ථා පරීක්ෂා කරනු ඇත:

  1. නිර්වචනය නොකළ : අගය අර්ථ දක්වා නොමැති නම් සහ එයundefined
  2. null : එය ශුන්‍ය නම්, උදාහරණයක් ලෙස, DOM අංගයක් නොපවතී නම් ...
  3. හිස් නූල :''
  4. 0 : අංක ශුන්‍යය
  5. NaN : අංකයක් නොවේ
  6. බොරු

එබැවින් එය සියලු ආකාරයේ අවස්ථාවන් ආවරණය කරනු ඇත, නමුත් සෑම විටම අප ආවරණය කිරීමට කැමති අමුතු අවස්ථා තිබේ, නිදසුනක් ලෙස, මේ හා සමාන අවකාශයක් සහිත නූලක් ' ', මෙය ජාවාස්ක්‍රිප්ට් වලින් අර්ථ දක්වනු ඇත. ... උදාහරණයක් ලෙස මෙම අවස්ථාවේදී ඔබ ටිම් () භාවිතා කරමින් තවත් එක් චෙක්පතක් එක් කරයි, වැනි:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

එසේම, මෙම චෙක්පත් අගයන් සඳහා පමණක් වන අතර, ජාවාස්ක්‍රිප්ට් හි වස්තු සහ අරා වෙනස් ලෙස ක්‍රියා කරන බැවින් හිස් අරාව []සහ හිස් වස්තුව {}සැමවිටම සත්‍ය වේ.

පිළිතුරේ කෙටි විස්තරයක් පෙන්වීමට මම පහත රූපය නිර්මාණය කරමි:

නිර්වචනය නොකළ, ශුන්‍ය යනාදිය


2
L අලිරේසා, හොඳයි! ඔබේ පිළිතුර එහි සිටින බොහෝ දෙනෙකුට උපකාරී වනු ඇත. මම දැනටමත් මෙම ව්‍යාජ සාරධර්ම කටපාඩම් කර ඇත්තෙමි, මට විශ්වාස නැති එකම දෙය [].
තියාගෝ යොයිති

13
මට "ReferenceError: elem යන්න අර්ථ දක්වා නැත"
ropo

3
@ropo, එයට හේතුව ඔබ එය පරීක්ෂා කිරීමට එලිම් එක නිර්වචනය කර නැති නිසා, එය ඔබේ නඩුව නම්, ඔබ එය දැනටමත් සඳහන් කර ඇති typeof (elem) === “string” සමඟ පරීක්ෂා කළ යුතුය ...
Alireza

22
if(elem)නිර්වචනය නොකළ චෙක්පත් යැයි පවසන විට පිළිතුර නොමඟ යවන සුළුය (එය අර්ථ දක්වා නැති දෝෂයක් ආපසු ලබා දෙන අතර), එසේ නොවේ ද?
ෆැන්කි

1
විචල්‍යයක් නිර්වචනය කර නොමැතිද සහ නිර්වචනය නොකළ අගයකින් නිර්වචනය කර ඇත්දැයි පරීක්ෂා කිරීම සඳහා මට භාවිත නඩුවක් දෙන්න? ඔබගෙන් සමහරෙක් පිදුරු ග්‍රහණය කර දීප්තිමත් පෙනුමක් ලබා ගැනීමට උත්සාහ කරන නමුත් ඔබ වටිනාකමක් නිර්වචනය කර නොමැති නම් සහ එම අගය පරික්ෂා කරන්නේ නම් එය පැහැදිලිවම අසත්‍යයක් වනු ඇත හෝ ඔබේ කේතය වෙනස් කළ යුතුය, smh .... මෙම පිළිතුර නිවැරදි ය !! !!!
almcaffee

210

ජාවාස්ක්‍රිප්ට් හි, විචල්‍යයක් අර්ථ දැක්විය හැකි නමුත් අගය රඳවා තබා ගන්න undefined, එබැවින් වඩාත් පොදු පිළිතුර තාක්‍ෂණිකව නිවැරදි නොවන අතර ඒ වෙනුවට පහත සඳහන් දෑ සිදු කරයි:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

එය ඔබගේ අරමුණු සඳහා ප්‍රමාණවත් විය හැකිය. පහත දැක්වෙන පරීක්ෂණයට සරල අර්ථකථන ඇත, එමඟින් ඔබේ කේතයේ හැසිරීම නිවැරදිව විස්තර කිරීම සහ එය ඔබම තේරුම් ගැනීම පහසු කරයි (ඔබ එවැනි දේ ගැන සැලකිලිමත් නම්):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

ඇත්ත වශයෙන්ම, මෙය ඔබ බ්‍රව්සරයක ධාවනය වන බව උපකල්පනය කරයි ( windowගෝලීය වස්තුව සඳහා නමක් ඇති තැන). නමුත් ඔබ මේ වගේ ග්ලෝබල් සමඟ විනෝද වන්නේ නම් ඔබ බොහෝ විට බ්‍රව්සරයක සිටී. භාවිතා තේමාව, 'name' in windowභාවිතා සමග ශෛලිය අතින් අනුරූප ය window.nameglobals වෙත යොමු කිරීමට. windowවිචල්‍යයන්ට වඩා ගුණාංග ලෙස ග්ලෝබල් වෙත ප්‍රවේශ වීම මඟින් ඔබේ කේතයේ ඔබ සඳහන් කර ඇති ප්‍රකාශයට පත් නොකළ විචල්‍යයන් ගණන අවම කර ගැනීමට ඉඩ සලසයි (ලින්ටින් කිරීමේ ප්‍රයෝජනය සඳහා), සහ දේශීය විචල්‍යයක් මඟින් ඔබේ ගෝලීය සෙවනැලි වීමේ හැකියාව වළක්වයි. එසේම, ග්ලෝබල් ඔබේ සමට බඩගා ගියහොත් ඔබට ඒවා ස්පර්ශ කිරීමට වඩාත් පහසුවක් දැනෙන්නේ මෙම සාපේක්ෂව දිගු සැරයටියකින් පමණි.


7
මෙය පරික්ෂා කරන්නේ විචල්‍යය ගෝලීයව ප්‍රකාශයට පත් කළේ නම් පමණි. ඔබ නිසියාකාරව කේතනය කරන්නේ නම්, ඔබ ඔබේ ගෝලීය වර්‍ග සීමා කරයි. එය දේශීය vars සඳහා සාවද්‍ය ලෙස වාර්තා කරනු ඇත: (ශ්‍රිතය () {var sdfsfs = 10; console.log (කවුළුවේ "sdfsfs");}) () `
එඩී මොන්ජ්

2
හොඳම f $ # ^% ඉංග්‍රීසි පිළිතුර මෙයයි. මෙම කෙළවරේ ඇති නඩුව සඳහා හරියටම ගණනය කරන්නේ කෙසේදැයි සොයා බැලීමට මම උත්සාහ කළෙමි . දීප්තිමත්. ඔබට මෙය කළ හැකි යැයි අදහසක් නොතිබුණි.
තාවකාලික_සර්_නාමය

1
ශීර්ෂ පා: ය: ඔබේ පිළිතුර stackoverflow.com/questions/519145/…
Shog9

කෝණික පරිශීලකයින් සඳහා: අවාසනාවකට මෙන්, එය ng-if ප්‍රකාශයකින් අවසර දී ඇති බවක් නොපෙනේ.
qwertzguy

... විෂය පථය ඔස්සේ චෙක්පත් සඳහා පරිපූර්ණ සැලැස්මක්. "කවුළුව තුළ" හෝ "(typeof variable === 'undefined' || variable === null)" නම් ඔබට කිසියම් කාර්ය සාධන දර්ශකයක් තිබේද? ඇත්ත වශයෙන්ම මම උනන්දු වන්නේ දෘ fact කරුණු පරීක්‍ෂණයකට මිස තර්කානුකූල විභව තාර්කිකත්වයට නොවේ (මට එය කළ හැකි ය: දෙවන වගන්තියට වැඩි මෙහෙයුම් ඇත -> නරක ක්‍රියාකාරිත්වය)
ඉක්මන්

120

ඔබ භාවිතා කරන බොහෝ අවස්ථාවන්හිදී:

elem != null

සරල මෙන් නොව if (elem), එය ඉඩ 0, false, NaNහා '', නමුත් ප්රතික්ෂේප කරයි nullහෝ undefined, එය හොඳ, තර්කයක් ඉදිරියේ සඳහා පොදු පරීක්ෂණය, හෝ වස්තුවක දේපල කරමින්.


අනෙක් චෙක්පත් ද වැරදි නැත, ඒවාට වෙනස් භාවිතයන් ඇත:

  • if (elem): නම් භාවිතා කළ හැක elemවස්තුවක් විය සහතික කර ඇත, හෝ නම් false, 0ආදිය "පෙරනිමි" අගයන් (කිරීමට ඒ නිසා සමාන ලෙස සලකනු ලැබේ undefinedහෝ null).

  • typeof elem == 'undefined'nullනිශ්චිත නොවන ආරම්භක විචල්‍යයකට හෝ දේපලකට පැහැදිලි අර්ථයක් ඇති අවස්ථාවන්හිදී භාවිතා කළ හැකිය .

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

ඊට සාපේක්ෂව දැඩි සංසන්දනයක් ද ප්‍රයෝජනවත් වේ undefined:

if (elem === undefined) ...

කෙසේ වෙතත්, ගෝලීය undefinedවෙනත් අගයකින් අභිබවා යා හැකි බැවින්, එය undefinedභාවිතා කිරීමට පෙර වත්මන් විෂය පථයේ විචල්‍යය ප්‍රකාශ කිරීම වඩාත් සුදුසුය :

var undefined; // really undefined
if (elem === undefined) ...

හෝ:

(function (undefined) {
    if (elem === undefined) ...
})();

මෙම ක්‍රමයේ ද්විතියික වාසියක් නම්, JS මිනිෆයර් මඟින් undefinedවිචල්‍යය තනි අක්ෂරයකට අඩු කළ හැකි අතර, සෑම අවස්ථාවකදීම ඔබට බයිට් කිහිපයක් ඉතිරි වේ.


19
ඔබට කම්පනය කළ හැකි බව මම කම්පාවට පත් කරමි undefined. පිළිතුරේ සඳහන් කිරීම වටී යැයි මම නොසිතමි. බොහෝ ජාවාස්ක්‍රිප්ට් වල ඇති නරකම පිළිගත හැකි විචල්‍ය නාමය විය හැකිය.
කෝරි ඩැනියෙල්සන්

2
මෙය ව්‍යතිරේකයකට හේතු වන window.අතර ගෝලීය සන්දර්භය තුළ භාවිතා කරන්නේ නම් විචල්‍යයට පෙර භාවිතා කිරීමට ඔබට අවශ්‍ය වේ ... මෙය හොඳම ක්‍රමය නොවේ.
ඇලෙක්ස් ඩබ්ලිව්

4
මෙම අතිච්ඡාදනය වන ගැටලුව නිසා ඔබ void(0)ඒ වෙනුවට සෑම විටම භාවිතා කළ යුතුය undefined.
බාර්ටෝමිජ් සාලෙව්ස්කි

මෙම පිළිතුර නිසා +1 සමහර විට ඇත්ත වශයෙන්ම ඔබ විය හැක බව පෙන්වා දෙයි අවශ්ය හඳුනා ගැනීම සඳහා false, 0වලංගු නොවන අගයන් ලෙස ආදිය.
rinogo

79

තිබේදැයි පරීක්ෂා කරන්න window. hasOwnProperty( " varname" )

typeofපිළිතුරු රාශියකට විකල්පයක් ;

ගෝලීය විචල්‍යයන් var varname = value;ගෝලීය විෂය පථයේ ප්‍රකාශයක් සමඟ ප්‍රකාශයට පත් කෙරේ

කවුළු වස්තුවේ ගුණාංග ලෙස ප්‍රවේශ විය හැකිය.

එනිසා, hasOwnProperty()ක්රමය, කුමන

වස්තුවට නිශ්චිත දේපලක් එහි දේපලක් ලෙස තිබේද යන්න දක්වමින් බූලියන් ලබා දෙයි (එය උරුම කර ගැනීමට වඩා වෙනස්ව)

යන්න තීරණය කිරීමට භාවිතා කළ හැකිය

එය var"varname" ගෝලීය ප්රකාශයට පත් කර තිබේ එනම් එම ක දේපළක් window.

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

මෙහි ඇති වැදගත් hasOwnProperty()දෙය නම්, එය ඇමතීමේදී, අපි තවමත් ප්‍රකාශයට පත් නොකළ විචල්‍යයක් භාවිතා නොකිරීමයි - ඇත්ත වශයෙන්ම කුමන ගැටලුව මුලින් අඩක් ද?

නැති වුණත් හැම විටම එම පරිපූර්ණ හෝ පරිපූර්ණ විසඳුමක්, යම් යම් අවස්ථාවල දී, එය හුදෙක් රස්සාව!

සටහන්

භාවිතා කරන විට ඉහත සැබෑ ය varවිචල්ය නිර්වචනය කිරීමට විරුද්ධ ලෙස, letඇති:

බ්ලොක් විෂය පථය දේශීය විචල්‍යය ප්‍රකාශ කරයි, විකල්පයක් ලෙස එය අගයකට ආරම්භ කරයි.

වාර්‍තා varවිෂය පථය නොසලකා ගෝලීය වශයෙන් හෝ දේශීයව සමස්ත ශ්‍රිතයක් සඳහා විචල්‍යයක් නිර්වචනය කරන යතුරු පදයට වඩා වෙනස් වේ.

ඉහළ මට්ටමේ වැඩසටහන් සහ කාර්යයන් let, මෙන් නොව var, ගෝලීය වස්තුව මත දේපලක් නිර්මාණය නොකරයි.

සම්පූර්ණත්වය සඳහා: const නියතයන් අර්ථ දැක්වීම අනුව සත්‍ය වශයෙන්ම විචල්‍ය නොවේ (ඒවායේ අන්තර්ගතය විය හැකි වුවද); වඩාත් අදාළ:

varවිචල්‍යයන් මෙන් නොව ගෝලීය නියතයන් කවුළු වස්තුවේ ගුණාංග බවට පත් නොවේ . නියතයක් සඳහා ආරම්භකයක් අවශ්‍ය වේ; එනම්, ඔබ ප්‍රකාශ කළ ප්‍රකාශයේම එහි වටිනාකම සඳහන් කළ යුතුය.

නියතයක අගය නැවත පැවරීමෙන් වෙනස් කළ නොහැකි අතර එය නැවත ප්‍රකාශ කළ නොහැක.

සංයුක්ත ප්‍රකාශනය මඟින් අගය සඳහා කියවීමට පමණක් යොමු කිරීමක් නිර්මාණය කරයි. විචල්‍ය හැඳුනුම්පත නැවත පැවරිය නොහැකි තරමට එය සතුව ඇති අගය වෙනස් කළ නොහැකි බව එයින් අදහස් නොවේ.

සිට letවිචල්ය හෝ constනියත උරුම වූ ඕනෑම වස්තුවක ගුණ කිසි hasOwnProperty()ක්රමය, එය ඔවුන්ගේ පැවැත්ම සඳහා පරීක්ෂා කිරීම සඳහා භාවිතා කළ නොහැක.

ලබා ගත හැකි සහ භාවිතා කිරීම සම්බන්ධයෙන් hasOwnProperty():

සෑම වස්තුවකට පැවත වස්තූන් ද අනුන hasOwnProperty()ක්රමය. [...] inක්‍රියාකරු මෙන් නොව , මෙම ක්‍රමය මඟින් වස්තුවේ මූලාකෘති දාමය පරීක්ෂා නොකරයි.


1
මෙය පුදුමාකාර විකල්පයක් වන අතර මෙම ප්‍රශ්නයේ ඉහළින්ම තිබිය යුතුය. කරුණාකර පිළිතුරු සපයන ශීර්ෂය නැවත වැඩ කරන උදාහරණයකින් සරල කරන්න true(උදා. window.hasOwnProperty('console')හෝ var hop = "p";window.hasOwnProperty('hop')).
සීපීඑච්පයිතන්

2
අවසාන වශයෙන් නොපවතින සාමාජිකයෙකුට ප්‍රවේශ වීම නිසා දෝෂයක් ඇති නොවන දෙයක්… සියලු typeofපිළිතුරු සරලව නොසලකා හරිනු ඇත.
සෙල්ෆීර් කල්ට්ස්ටාල්

2
මෙම පිළිතුර යල්පැන ඇති ය - සම්මත ECMAScript අනුව ඔබට letමෙම විචල්‍යයන් window[හෝ වෙනත් ඕනෑම] වස්තුවක ගුණාංග ලෙස ලබා ගත නොහැකි ස්ථාන සමඟ විචල්‍යයන් අර්ථ දැක්විය හැකිය. විචල්‍යයන් නොව ගුණාංගhasOwnProperty පවතින බව පරීක්‍ෂා කරන අතර එමඟින් අර්ථ දක්වා ඇති විචල්‍යයන් හඳුනා ගැනීමට භාවිතා කළ නොහැක . let
amn

1
namn භාවිතය සම්බන්ධයෙන් පිළිතුර සත්‍ය වන varඅතර එය යල් පැන ගිය එකක් නොවේ. කෙසේ වෙතත්, භාවිතය letහා ඒවායින් constවෙනස් වන්නේ කෙසේද යන්න දැක්වෙන සටහනක් මම එකතු කර ඇත්තෙමි var. ඔබගේ ආනුභාවයට ස්තූතියි; එකට අපි නැගී සිටිමු :)
ෆ්‍රෙඩ් ගාන්ඩ්

2
විචල්යයන්ගේ hasOwnPropertyපැවැත්ම පරීක්ෂා කිරීම සඳහා නියමිත ආකාරයෙන් පමණක් භාවිතා කළ හැකි බව වඩාත් පැහැදිලි කිරීම සඳහා මම පිළිතුර නැවත ලියා ඇත (අවසාන වරට බලාපොරොත්තු වෙමි) var. ඒක මට හරි කියවනවා.
ෆ්‍රෙඩ් ගාන්ඩ්

68

විචල්යයක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද

විචල්‍යයක් පවතින අතර එය ආරම්භ කර ඇත්දැයි පරීක්ෂා කිරීම සඳහා මෙය ලස්සන වෙඩි නොවදින විසඳුමකි:

var setOrNot = typeof variable !== typeof undefined;

කිසියම් විචල්‍යයක් ආරම්භ කර නොමැති විට පෙරනිමිය සැකසීම සඳහා එය ත්‍රිමාණ ක්‍රියාකරු සමඟ සංයෝජිතව බහුලව භාවිතා වේ:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

සංසරණය වීමේ ගැටළු

අවාසනාවකට, ඔබට ශ්‍රිතයක් තුළ ඔබගේ චෙක්පත සරලව වටහා ගත නොහැක.

මේ වගේ දෙයක් කිරීම ගැන ඔබට සිතිය හැකිය:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

කෙසේ වෙතත්, ඔබ උදා අමතන්නේ නම් මෙය යොමු දෝෂයක් ඇති කරයි. isset(foo)සහ විචල්‍යය fooනිර්වචනය කර නැත, මන්ද ඔබට පවතින විචල්‍යයක් ශ්‍රිතයකට යැවිය නොහැකි බැවිනි:

හඳුනා නොගත් යොමු දෝෂය: foo යන්න අර්ථ දක්වා නැත


ක්‍රියාකාරී පරාමිතීන් නිර්වචනය කර නොමැතිදැයි පරීක්ෂා කිරීම

issetවිචල්‍යයක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා අපගේ ශ්‍රිතය භාවිතා කළ නොහැකි අතර (මෙහි විස්තර කර ඇති හේතු නිසා), ශ්‍රිතයක පරාමිතීන් නිර්වචනය කර නොමැතිදැයි පරීක්ෂා කිරීමට එය අපට ඉඩ දෙයි:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

yක්‍රියාකාරීත්වය සඳහා කිසිදු වටිනාකමක් ලබා නොදුනද test, අපගේ issetශ්‍රිතය මෙම සන්දර්භය තුළ පරිපූර්ණව ක්‍රියා කරයි, මන්ද yඑය ශ්‍රිතයේ අගය testලෙස හැඳින්වේ undefined.


41

ඔබ සරල පැවරුම් සහ අදාළ චෙක්පත් සිදු කරන විට මෙය පරීක්ෂා කිරීමට තවත් කෙටි ක්‍රමයක් තිබේ. සරලව භාවිතා කොන්දේසි සහගතව (මිශ්ර) ක්රියාකරු.

var values = typeof variable !== 'undefined' ? variable : '';

සමුද්දේශ විචල්‍යය නිදර්ශන පැවරීම සමඟ ගෝලීය විචල්‍යය ප්‍රකාශ කිරීමට ඔබ උත්සාහ කරන විට මෙයද ප්‍රයෝජනවත් වනු ඇත.

ඔබට විචල්යය පරීක්ෂා කිරීමට අවශ්ය නම් undefinedහෝ නොවිය යුතුය null. ඉන්පසු පහත චෙක්පත සිදු කරන්න.

විචල්‍යය ප්‍රකාශයට පත් කළ විට, සහ ඔබට අගය පරීක්ෂා කිරීමට අවශ්‍ය නම්, මෙය පවා සරල ය: එය ක්‍රියාත්මක වන undefinedඅතර nullඑකට පරීක්ෂා කරයි.

var values = variable ? variable : '';

පිළිතුර වැරදියි. typeof විචල්‍යය සෑම විටම නූලක් ලබා දෙයි, එබැවින් එය කිසි විටෙකත් අසත්‍ය නොවේ. නම් උදා typeof(booooo)වේ "undefined"නම් typeof(typeof boooooo)වේ "string"හා typeof boooooo && trueසැමවිටම true. @ ජෝන්-ස්ලෙගර්ස්ගේ පිළිතුර ඔබට යතුරු ලියනය සමඟ ලබා ගත හැකි තරම් කෙටි වේ.
mpag

එහි නියත නිවැරදි පිළිතුරයි . මෙන්න වැඩ කරන ෆිදෙල් . ඔබ දන්නේ කුමන සිදුවීම ගැනදැයි මම නොදනිමි. ප්රශ්න වන්නේ විචල්ය පැවැත්ම පරීක්ෂා කිරීමයි.
රාජේෂ්කේව්

පැම්පට් එක වැරදියි කියන්න එපා. එය ඔප්පු කරන්න . වැරැද්දක් සොයා ගැනීම ඇත්තෙන්ම පහසුය, ඒ වෙනුවට ඔබට මෙහි හොඳ පිළිතුරු සැපයිය හැකිය !!!. පිළිතුර වැරදියි නම් ක්‍රමලේඛකයින් 28 දෙනෙකු මගේ පිළිතුර පරික්ෂා නොකර ඡන්දය ප්‍රකාශ නොකරනු ඇත. මෙහි බොහෝ කීර්තිමත් පිළිතුරු ඇති බැවින් ඔවුන්ට ඡන්දය ප්‍රකාශ කළ හැකිව තිබුණේ මෙය නොවේ.
රාජේෂ්කේව්

ඇත්ත වශයෙන්ම දෙවන කේත කොටස, ඉහත කොන්දේසියට සමාන නොවේ. මෙම රේඛාව මගින් මිනිසුන් තේරුම් ගනු ඇතැයි මම සිතුවෙමි If you wanted to check variable shouldn't be undefined or null., මෙම අදහස් දැක්වීමෙන්, එය පැහැදිලිව සඳහන් කරමින්, විචල්‍ය ප්‍රකාශන පරීක්ෂාව සිදු නොකිරීමට. එය විචල්ය අගය පරීක්ෂා කිරීමයි.
රාජේෂ්කේව්

1
ඔබගේ 2 වන චෙක්පත 0 අගය සමඟ අසමත් වනු ඇත
ෆරීඩ් අල්නම්රූටි

34

විචල්යයක් පරීක්ෂා කිරීම සඳහා කෙටි ක්රමය ප්රකාශයට පත් නොකෙරේ (නිර්වචනය කර නැත)

if (typeof variable === "undefined") {
  ...
}

බ්‍රව්සරයෙන් පිටත ධාවනය වන ස්ක්‍රිප්ට් හඳුනා ගැනීමට එය ප්‍රයෝජනවත් බව මට පෙනී windowගියේය (ප්‍රකාශිත විචල්‍යයක් නොතිබීම ).


අතේ ගෙන යා හැකි “කැනොනිකල් ක්‍රමය” මෙයද?
ජේසන්

3
මේක වැරදියි. window.bar=undefinedඅර්ථ දක්වා ඇති අතර අගයකට සකසා ඇත. ඔබේ පිළිතුර මේ අතර වෙනස හඳුනා ගැනීමට අසමත් වන අතර විචල්‍යය නොපවතී නම්. ඔබ එසේ කළා නම් this.hasOwnProperty('bar')එය ක්‍රියාත්මක වීමට ඉඩ තිබුණි.
ඔලිගෝෆ්‍රන්

මෙම කේතය ක්‍රියා නොකරන අතර ඕනෑම බ්‍රව්සර් කොන්සෝලයක් භාවිතා කිරීමෙන් ඔබට මෙය සත්‍යාපනය කළ හැකිය
ha9u63ar

1
සලකා බලන්න const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. විචල්‍යය xනිර්වචනය කර ඇති නමුත් අසත්‍යය ආපසු ලබා දෙනු ලැබේ ...
user2878850

29

එය රඳා පවතින්නේ විචල්‍යය නිර්වචනය කර ඇති බවට හෝ එය අර්ථවත් අගයක් ලබා ගැනීමට ඔබට අවශ්‍ය නම් පමණි.

වර්ගය නිර්වචනය කර නොමැතිදැයි පරීක්ෂා කිරීමෙන් විචල්‍යය තවම අර්ථ දක්වා ඇත්දැයි පරීක්ෂා කරයි.

=== nullහෝ !== nullවිචල්‍යයේ අගය හරියටම දැයි පරික්ෂා කරයි null.

== nullහෝ != nullවටිනාකම නම් පරීක්ෂා කරනු ඇත undefinedහෝ null.

if(value)විචල්ය නම් පරීක්ෂා කරනු ඇත undefined, null, 0, හෝ හිස් අගයක්.


12

ඉහළම පිළිතුර නිවැරදි ය, typeof භාවිතා කරන්න.

කෙසේ වෙතත්, මට පෙන්වා දීමට අවශ්‍ය වූයේ ජාවාස්ක්‍රිප්ට් undefinedහි විකෘති වීමයි (කිසියම් අභක්තික හේතුවක් නිසා). එබැවින් හුදෙක් පරීක්‍ෂණයක් කිරීමෙන් varName !== undefinedඔබ බලාපොරොත්තු වන පරිදි සෑම විටම ආපසු නොයාමට හැකියාවක් ඇත, මන්ද වෙනත් ලිබ්ස් නිර්වචනය කර නොතිබිය හැකි බැවිනි. පිළිතුරු කිහිපයක් (@ ස්කලීස්, එකක් සඳහා), භාවිතා නොකිරීමට වැඩි කැමැත්තක් දක්වන අතර typeof, එයින් එකක් කරදරයකට පත්විය හැකිය.

මෙය හැසිරවිය හැකි “පැරණි” ක්‍රමය නම්, විභව විකෘති / අධික ලෙස ධාවනය කිරීම වළක්වා ගැනීම සඳහා නිර්වචනය නොකළ විචල්‍යයක් ලෙස ප්‍රකාශ කිරීමයි undefined. කෙසේ වෙතත්, හොඳම ක්‍රමය තවමත් භාවිතා කිරීම typeofනිසා එය undefinedවෙනත් කේත වලින් ඉක්මවා යාම නොසලකා හරිනු ඇත . විශේෂයෙන් ඔබ වනාන්තරයේ භාවිතා කිරීම සඳහා කේතයක් ලියන්නේ නම්, පිටුවේ ක්‍රියාත්මක විය හැකි වෙනත් දේ දන්නේ කවුද ...


1
කාරණය වැදගත් ය, මන්ද varName නිර්වචනය කර නොමැති නම් varName !== undefinedඑය ReferenceError එකක් ඇති කරයි. විකෘතිතාව undefinedවැදගත් නොවේ.
වුටාස්

ශීර්ෂ පා: ය: ඔබේ පිළිතුර stackoverflow.com/questions/519145/…
Shog9

1
නවතම ජාවාස්ක්‍රිප්ට් අනුවාද වල undefinedකියවීමට පමණක් ඇති දේපලකි. කෙසේ වෙතත් ඔබට වෙඩි නොවදින ලෙස භාවිතා කළ හැකිය typeof mvVar === typeof void 0. සෑම විටම void 0ආපසු පැමිණේ undefined.
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

නැත්නම් වඩා හොඳයි

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

සියලුම බ්‍රව්සර් වල ක්‍රියා කරයි


3
ඔබේ මතය අනුව දෙවැන්න වඩා හොඳ වන්නේ ඇයි?
skalee

3
kskalee මම එකඟයි දෙවැන්න වඩා හොඳයි. මෙය භාවිතා කිරීමට පෙර ඔබට අවශ්‍ය වර්ගදැයි ඔබ පරීක්ෂා කරන සරල හේතුව නිසාය.
බ්‍රොක්සියර්

ශීර්ෂ පා: ය: ඔබේ පිළිතුර stackoverflow.com/questions/519145/…
Shog9

9

විවාදයට දායක වීම සඳහා, විචල්‍යය මා නිතරම කැමති නූලක් හෝ වස්තුවක් විය යුතු බව මා දන්නේ if (!variable)නම්, එහි ව්‍යාජදැයි පරීක්ෂා කරන්න. මෙය වඩාත් පිරිසිදු කේතයක් ගෙන ඒමට හැකි වන පරිදි, උදාහරණයක් ලෙස:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

පහත පරිදි අඩු කළ හැකිය:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


OP ඉල්ලා සිටියේ මෙය නොවේ. Data.url ''ඔබේ විසඳුමට සමාන නම් එය හිස් නූලක් අඩංගු යැයි අර්ථ දක්වා ඇති විට එය නිර්වචනය නොකෙරේ .
ඩිමන් බ්ලැක්

මම එකඟ වන්නේ ඉල්ලූ දෙය නොවන අතර ඔබ නිවැරදියි: හිස් නූල '' නිර්වචනය නොකළ ලෙස සලකනු ලැබේ. නමුත් මම මෙය පළ කළේ විවිධ පිළිතුරු අතර නිර්මාණය වී ඇති විවාදයට එය ප්‍රයෝජනවත් වේ යැයි සිතූ බැවිනි. උදාහරණයේ දී මෙන්ම වෙනත් බොහෝ අවස්ථාවන්හි දී ඔබට සත්‍ය වශයෙන්ම අන්තර්ගතයක් තිබේ නම් නූලක් මුද්‍රණය කිරීමට අවශ්‍යය, එබැවින් ජාවාස්ක්‍රිප්ට් හිස් නූල් සහ නිර්වචනය නොකළ යන දෙකම ව්‍යාජ ලෙස සලකන බැවින් එයින් ප්‍රයෝජන ගැනීම
සුදුසුය

8

නිර්වචනය නොකළ හා ශුන්‍ය අතර වෙනස හඳුනා ගැනීම දුෂ්කර ය. Null යනු විචල්‍යයට නිශ්චිත අගයක් නොමැති බව දැක්වීමට අවශ්‍ය විට ඔබට විචල්‍යයකට පැවරිය හැකි අගයකි. නිර්වචනය නොකළ විශේෂ අගයක් වන අතර එය නියම නොකළ විචල්‍යයන්ගේ පෙරනිමි අගය වේ.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
එක් එක් ඇඟවීම්වල ප්‍රතිදානය පේළිගත කිරීමට පෙන්වීමට උපකාරී වේ.
demisx

emdemisx එකඟ විය, නමුත් සංස්කරණය යෝජනා කරනවා වෙනුවට, එය පමණක් නොකරන්නේ ඇයි? විකල්පය ඇත්තේ හේතුවක් ඇත. සමහරු එය අකාරුණික ලෙස සලකති; මම එය කාර්යක්ෂම යැයි සලකමි - එබැවින් පිළිතුර මා විසින්ම සංස්කරණය කරන ලදි (සමාලෝචනය සඳහා ඉතිරිව ඇත).
ෆ්‍රෙඩ් ගාන්ඩ්

1
Red ෆ්‍රෙඩ් - මම සංස්කරණ ඉතිහාසය දෙස බැලුවෙමි, ඔබේ සංස්කරණයන් ප්‍රතික්ෂේප වූයේ මන්දැයි අනුමාන කළ හැකිය ... ප්‍රතිදානය කුමක් දැයි පෙන්වීමට රේඛා එකතු කරනවාට වඩා, ඩිමික්ස් යෝජනා කළ පරිදි, ඔබ ජිත් පළ කළ දේ සැලකිය යුතු ලෙස වෙනස් කළේය.
ස්ටීවන් පී

8

Null යනු ජාවාස්ක්‍රිප්ට් හි අගයකි typeof null ප්රතිලාභ"object"

එමනිසා, ඔබ ශුන්‍ය අගයන් සමත් වුවහොත් පිළිගත් පිළිතුර ක්‍රියා නොකරනු ඇත. ඔබ ශුන්‍ය අගයන් පසු කරන්නේ නම්, ඔබට ශුන්‍ය අගයන් සඳහා අමතර චෙක්පතක් එක් කළ යුතුය:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

වඩාත්ම ශක්තිමත් 'එය අර්ථ දක්වා ඇත්තේ' චෙක්පත ටයිප් ඔෆ් සමඟ ය

if (typeof elem === 'undefined')

පෙරනිමිය පැවරීම සඳහා ඔබ නිර්වචනය කළ විචල්‍යයක් සොයන්නේ නම්, එක් ලයිනර් කියවීම පහසු කිරීම සඳහා ඔබට බොහෝ විට මෙය කළ හැකිය:

elem = elem || defaultElem;

එය භාවිතා කිරීම බොහෝ විට හොඳයි, බලන්න: ජාවාස්ක්‍රිප්ට් හි පෙරනිමි අගය සැකසීමට මුග්ධ ක්‍රමය

යතුරු ලියනය යතුරු පදය භාවිතා කරමින් මෙම එක් ලයිනර් එකක් ද ඇත :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

ඔබට භාවිතා කළ හැකිය typeof ක්‍රියාකරු .

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

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

ඉහත කේත ස්නිපටය වැනි ප්‍රතිදානය නැවත ලබා දෙනු ඇත

විචල්ය දත්ත කට්ටලය: නිර්වචනය නොකළ.


1
ශීර්ෂ පා: ය: ඔබේ පිළිතුර stackoverflow.com/questions/519145/…
Shog9

7

විචල්යයක් ප්රකාශයට පත් කර තිබේද / පරීක්ෂා කර ඇත්දැයි පරීක්ෂා කිරීම සඳහා මම මෙම අපිරිසිදු උපක්රමය කළෙමි.

ශ්‍රිතයකට කේතය උකහා ගැනීමට මට ක්‍රමයක් සොයාගෙන නැත eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

"ශ්‍රිතයකට කේතය උකහා ගැනීම" යන්නෙන් ඔබ අදහස් කරන්නේ කුමක්ද?
මෙලාබ්

7

මෙම පිළිතුරු (ෆ්‍රෙඩ් ගාන්ඩ් විසඳුම හැර) සියල්ලම වැරදි හෝ අසම්පූර්ණයි.

මට වටිනාකමක් variableName;ගෙනයාමට අවශ්‍ය යැයි සිතමු undefined, එබැවින් එය var variableName;දැනටමත් ආරම්භ කර ඇති බවක් අදහස් වන ආකාරයට ප්‍රකාශයට පත් කර ඇත ; - එය දැනටමත් ප්‍රකාශයට පත් කර ඇත්දැයි පරීක්ෂා කරන්නේ කෙසේද?

හෝ ඊටත් වඩා හොඳයි - "Book1.chapter22.paragraph37" එක ඇමතුමකින් තිබේද, නමුත් යොමු දෝෂයක් මතු නොවන්නේදැයි මම වහාම පරීක්ෂා කරන්නේ කෙසේද?

අපි ඉතා බලගතු JasvaScript ක්රියාකරු, භාවිතා කරමින් එය කරන්න තුළ ක්රියාකරු .:

"[variable||property]" in [context||root] 
>> true||false

AJAX ජනප්‍රියත්වයේ කාලවලදී මම "Book1.chapter22.paragraph37" වැනි දේපල නම් සඳහා ගැඹුරු පරීක්ෂණ සහ තවත් බොහෝ දේ ඇතුළුව නාම අවකාශය තිබේද යන්න තීරණය කළ හැකි (පසුව නම් කරන ලද) isNS () ක්‍රමයක් ලියා ඇත.

නමුත් එය කලින් ප්‍රකාශයට පත් කර ඇති හෙයින් සහ එහි ඇති වැදගත්කම නිසා එය වෙනම ත්‍රෙඩ් එකක පළ කිරීමට සුදුසු බැවින් මම එය මෙහි පළ නොකරමි, නමුත් මූල කේත ( javascript + isNS ) ලබා දෙන්නෙමි. අවශ්‍ය පැහැදිලි කිරීම්.


1
මෙම inක්රියාකරු පමණක් දේපල පැවැත්ම සඳහා පරීක්ෂා කර, සහ සියළුම විචල්ය ගුණ ඇත - constහා let(සහ ප්රකාශ නොවන const, හොඳින් හෝ නැත, විචල්ය ).
amn

1
constහා let, සම්මතයන් 2015, වසර 3 කට පෙර වඩා ප්රකාශයට පත් කරන ලද අතර පසුව සුපුරුදු සැකකරුවන් විසින් හොඳ සම්මත දැක ඇති අතර ඔහු අද ඒ වෙනුවට pervasively භාවිතා කරන සමඟ සම්මත කරන ලදී එඩිතර මට කියන්න - Github මත "const" සිදුවීම් මිලියන 2 කට වඩා වැඩි නැත JS ගොනු වල .
amn

ඔව්, "විචල්ය" - හරියටම. ඔබේ පිළිතුර ගැන මා අදහස් දැක්වූයේ, විචල්‍යයක් තිබේද යන්න සාමාන්‍යයෙන් පරීක්ෂා කිරීමට ඔබට ක්‍රියාකරු භාවිතා කළ නොහැකි බව පෙන්වා දෙමින් , “const and let [[ගුණාංග]” නොවන නිසා - නියත යොමු කිරීමක් හඳුන්වා දෙන බව පැවසිය හැකිය. විරුද්ධ බවත් විචල්ය සඳහනක්, අනෙක් අතට, සත්ය වශයෙන්ම හඳුන්වා නැත විචල්ය සඳහනක් - එය වන අතර, වෙනත් වචන වලින් කිවහොත්, ඕනෑම පියවරක් විසින්, විචල්ය සහ ඔබේ පිළිතුර වැරදි ඔබ සමඟ අර්ථ විචල්ය යන්න පරීක්ෂා කර බැලිය හැකි බව හඟවමින් වේ පවතී ක්රියාකරු භාවිතා කිරීමෙන් - ඔබට බැහැ. inconstletletin
amn

ECMAScript 6 පිරිවිතර ජාවාස්ක්‍රිප්ට් භාෂාව අර්ථ දක්වන්නේ ඔබ හෝ වෙබ් බ්‍රව්සරයක් නොවේ. ඒ නිසා එය පිරිවිතරයක් ලෙස හැඳින්වේ - එය නිසැකවම භාෂාව නියම කරයි. ඔබගේ පිළිතුර යල්පැනගිය ය, නරකම දෙය නම් ඔබ අදාළ නොවන යැයි සිතන දේ හිතාමතාම මඟ හැරීමයි . සම්බන්ධිත පිරිවිතර උපුටා දක්වමින්, "ඉඩ දෙන්න සහ සංක්ෂිප්ත ප්‍රකාශයන් විචල්‍යයන් අර්ථ දක්වයි". මෙම ඉදිකිරීම් windowවස්තුවේ ගුණාංග ලෙස ප්‍රවේශ විය නොහැක , මෙය ඔබට වඩාත් පැහැදිලි කරන්නේ කෙසේදැයි මම නොදනිමි.
amn

පිළිතුර විචල්‍යයන්ගේ සියලු අවස්ථා ආවරණය නොකරයි. නිශ්චිතවම, එය යතුරුපදය සමඟ අර්ථ දක්වා ඇති විචල්යයන් ආවරණය නොකරයි let. එපමණයි මම පෙන්වා දුන්නේ.
amn

6

ප්රශ්නයේ දක්වා ඇති විශේෂිත තත්වය තුළ,

typeof window.console === "undefined"

ට සමාන වේ

window.console === undefined

එය කෙටි බැවින් මම දෙවැන්නට කැමැත්තෙමි.

අප සොයන්නේ consoleගෝලීය විෂය පථයෙන් පමණක් බව කරුණාවෙන් සලකන්න (එය windowසියලු බ්‍රව්සර්වල ඇති වස්තුවකි). මෙම විශේෂිත තත්වය තුළ එය යෝග්ය වේ. අපට අවශ්‍ය නැතconsole වෙනත් තැනක අර්ථ .

Rian බ්‍රයන්කෙලි සිය විශිෂ්ට පිළිතුරෙන් තාක්ෂණික විස්තර පැහැදිලි කරයි. මම නිගමනයකට එළඹීම පමණක් එකතු කර එය කියවීමට පහසු දෙයකට ජීර්ණය කර ඇත්තෙමි.


ශීර්ෂ පා: ය: ඔබේ පිළිතුර stackoverflow.com/questions/519145/…
Shog9

2
අසත්‍යය. දෙවැන්න මගේ කොන්සෝලය තුළ ව්‍යතිරේකයක් විසි කරයි.
ජෝන් ktejik

6

වස්තුව අනුව මම වෙනස් ක්‍රම දෙකක් භාවිතා කරමි.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

සමහර විට හිස් නූලක් ව්‍යාජ ලෙස තක්සේරු කිරීමට මට අවශ්‍ය නැත, එබැවින් මම මෙම නඩුව භාවිතා කරමි

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

ඔබට ප්‍රතිවිරුද්ධ දේ අවශ්‍ය නම්, පළමු අවස්ථාවේදී! විචල්‍යය !! විචල්ය බවට පත්වන අතර අවලංගු ශ්‍රිතයේ === බවට පත්වේ! = සහ ශ්‍රිත නාම වෙනස් නොවන බවට වෙනස් වේ.


5

මගේ මනාපය typeof(elem) != 'undefined' && elem != null.

කෙසේ වෙතත් ඔබ තෝරා ගත්තද, චෙක්පත එවැනි ශ්‍රිතයකට දැමීම ගැන සලකා බලන්න

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

විචල්‍යය ප්‍රකාශයට පත් කර ඇති බව ඔබ නොදන්නේ නම් ඉදිරියට යන්න typeof (x) != 'undefined' && x != null;

විචල්‍යය ප්‍රකාශයට පත් කර ඇති නමුත් නොපවතින තැන ඔබ භාවිතා කළ හැකිය

existy(elem) && doSomething(elem);

ඔබ පරික්ෂා කරන විචල්‍යය සමහර විට කැදැලි දේපලක් විය හැකිය. ඔබට මුක්කු භාවිතා කළ හැකිය || question question ප්‍රශ්නයට ලක්වූ දේපලෙහි පැවැත්ම පරීක්ෂා කර බැලීමට:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

එක් එක් දේපල භාවිතයෙන් පසු (... '|| {}'). ඊළඟ ප්‍රොපර් මඟින් නැතිවූ දේපලක් දෝෂයක් ඇති නොවන පරිදි.

නැතහොත් ඔබට වැනි පැවැත්මක් භාවිතා කළ හැකිය existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


ඔබ එය ශ්‍රිතයකට දැමුවහොත් එය අතිරික්ත වේ. typeof (x) != 'undefined' && x != nullප්‍රකාශයට පත් කරන x != nullවිට සමාන xවේ.
Ry-

5

උත්සාහ කරන්න

විචල්‍යය කිසිසේත් නිර්වචනය කර නොමැති නම්, ඔබට පහත දැක්වෙන පරිදි ට්‍රයිච්-කැච් බ්ලොක් භාවිතා කරමින් බ්‍රේක් කේත ක්‍රියාත්මක කිරීමකින් තොරව මෙය පරීක්ෂා කළ හැකිය (ඔබට use strictප්‍රකාරය කිරීමට අවශ්‍ය නැත )

බෝනස්: (වෙනත් පිළිතුරු වෙත යොමු කරමින්) ( මූලාශ්‍රයට=== වඩා පැහැදිලි වන්නේ ඇයි?== )

if (a == b)

රූප විස්තරය මෙහි ඇතුළත් කරන්න

if (a === b)

රූප විස්තරය මෙහි ඇතුළත් කරන්න


2
FYI, (a == b) ගේම් ඔෆ් ලයිෆ් ජාලයට ඇතුළත් කිරීම එතරම් සිත්ගන්නාසුළු නොවීය.
ජෝන්ස්නේල්ස්

3

එය තත්වය මත රඳා පවතී. ඔබගේ කේතයෙන් පිටත ගෝලීයව අර්ථ දක්වා ඇති හෝ නොවිය හැකි යමක් ඔබ පරික්ෂා කරන්නේ නම් (සමහර විට jQuery වැනි) ඔබට අවශ්‍ය:

if (typeof(jQuery) != "undefined")

.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

1

මට පුදුමයි මේක තවම සඳහන් නොවීම ...

භාවිතා කරමින් අමතර වෙනස්කම් කිහිපයක් මෙන්න this['var_name']

විචල්‍යයක් නිර්වචනය කිරීමට පෙර එය භාවිතා කළ හැකි මෙම ක්‍රමය භාවිතා කිරීමේ වාසිය.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

මේක වැරදියි. window.bar=undefinedඅර්ථ දක්වා ඇති අතර අගයකට සකසා ඇත. ඔබේ පිළිතුර මේ අතර වෙනස හඳුනා ගැනීමට අසමත් වන අතර විචල්‍යය නොපවතී නම්. ඔබ එසේ කළා නම් this.hasOwnProperty('bar')එය ක්‍රියාත්මක වීමට ඉඩ තිබුණි.
ඔලිගෝෆ්‍රන්

0

ඔබට පහත දැක්වෙන පරිදි උත්සාහ කර බලන්න ...

අවාසියක් නම් ඔබට එය ශ්‍රිතයක් තුළට යොමු කළ නොහැකි බැවින් එය යොමු දෝෂයක් විසි කරයි

function variableExists(x) {
  var status = true
  try {
      x
  } catch (ReferenceError) {
      status = false
  }
  
  return status
}

console.log(variableExists(x))

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

ඔබ ඉදිරිපස ජාවාස්ක්‍රිප්ට් හි වැඩ කරමින් සිටියේ නම් සහ විචල්‍යයක් ආරම්භ කර නොමැතිදැයි පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නම් ( var x = undefinedආරම්භ නොකළ ලෙස ගණන් ගනු ඇත), ඔබට මෙය භාවිතා කළ හැකිය:

function globalVariableExists(variable) {
  if (window[variable] != undefined) {
    return true
  }
  
  return false
}

var x = undefined

console.log(globalVariableExists("x"))

console.log(globalVariableExists("y"))

var z = 123

console.log(globalVariableExists("z"))

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.