Праверка, калі зменная існуе ў JavaScript

Я ведаю, што ёсць два спосабу, каб вызначыць, ці з'яўляецца пераменная у JavaScript ёсць, і нельга нуль (хлусня, пусты):

1) if ( typeof variableName !== 'undefined' && variableName )

2) if ( window.variableName )

якіх адзін з'яўляецца найлепшым i чаму?

56
Чаму window.variableName ? Калі зменная з'яўляецца лакальнай, то атрымаецца да нявызначанымі, нават калі пераменная вызначана.
дададзена аўтар Asad Saeeduddin, крыніца
Акрамя таго, будучы "не нуль» артаганальнай Ці значэнне зменнай хлусня .
дададзена аўтар Asad Saeeduddin, крыніца
CoffeeScript мае свой уласны аператар для гэтай задачы і код JS генераванай з яе даволі цікава. stackoverflow.com/questions/9992620/…
дададзена аўтар Bjoern Rennhak, крыніца

8 адказы

Пераменная з'яўляецца аб'яўлена , калі доступ да імя зменнай не будзе вырабляць ReferenceError . ! Выраз TypeOf имяПеременной == «не вызначанае» будзе хлусня толькі ў адным з двух выпадкаў:

  • the variable is not declared (i.e., there is no var variableName in scope), or
  • the variable is declared and its value is undefined (i.e., the variable's value is not defined)

У адваротным выпадку, параўнанне мае значэнне True .

Калі вы сапраўды хочаце, каб праверыць, калі зменная аб'яўлена ці не, вам трэба злавіць любы ReferenceError вырабляецца спробы спасылацца на яго:

var barIsDeclared = true; 
try{ bar; }
catch(e) {
    if(e.name == "ReferenceError") {
        barIsDeclared = false;
    }
}

Калі вы проста хочаце, каб праверыць, калі значэнне абвешчанай зменнай з'яўляецца ні не вызначана , ні нулявым , вы можаце проста праверыць на яго:

if (variableName !== undefined && variableName !== null) { ... }

Ці тое ж самае, з нястрогі праверкі роўнасці ў дачыненні да Null :

if (variableName != null) { ... }

Both your second example and your right-hand expression in the && operation tests if the value is "falsey", i.e., if it coerces to false in a boolean context. Such values include null, false, 0, and the empty string, not all of which you may want to discard.

86
дададзена
Ці з'яўляецца гэта сапраўды неабходна праверыць імя памылкі? Проста цікава, што тое, што могуць быць і іншыя памылкі, чым ReferenceError?
дададзена аўтар Sid, крыніца
Падзякі @apsillers. Гэта мае сэнс.
дададзена аўтар Sid, крыніца
@TomasZubiri Там няма ніякай розніцы; Я толькі цяпер змяніўся «тэст, калі пераменны з'яўляецца неабвешчанымі» на «тэст, калі зменная аб'яўлена ці не». Я спадзяюся, што гэта больш ясна.
дададзена аўтар apsillers, крыніца
@Sid толькі адзін, я думаў толькі пра тое, калі бар мае базавы паглынальнік, які выдае паведамленне пра памылку: Object.defineProperty (вокны, «бар», {атрымліваем: функцыя() {кідок " нешта ";})
дададзена аўтар apsillers, крыніца
У чым розніца паміж «пераменная не абвешчаная» і «пераменная неаб'яўленай»?
дададзена аўтар Tomas Zubiri, крыніца
О, я разумею, таму што іншы тэст будзе вяртаць хлусня, калі зменная была абвешчаная, але значэнне было вызначана.
дададзена аўтар Tomas Zubiri, крыніца

Важна адзначыць, што «не вызначанае» з'яўляецца цалкам дапушчальным значэннем зменнай для захоўвання. Калі вы хочаце праверыць, калі зменная існуе наогул,

if (window.variableName)

гэта больш поўная праверка, так як ён правярае, што пераменная фактычна была вызначана. Аднак, гэта толькі карысна, калі зменная гарантавана аб'ект! Акрамя таго, як ужо адзначалася, гэта таксама можа вяртаць хлусня, калі значэнне VARIABLENAME ілжыва, 0, «», ці нуль.

Тым не менш, гэта, як правіла, не дастаткова для нашых паўсядзённых мэтаў, так як мы часта не жадаем мець няпэўны значэнне. Такім чынам, вы павінны спачатку праверыць, што пераменная вызначана, а затым сцвярджаюць, што гэта не вызначана з дапамогай аператара TYPEOF, які, як Адам адзначыў, не будзе вяртаць нявызначаным, калі зменная сапраўды не вызначана.

if ( variableName  && typeof variableName !== 'undefined' )
17
дададзена
Хоць нявызначаная моц сапраўдным значэннем зменнай для захоўвання, праверкі TYPEOF не будзе вяртаць нявызначаным, калі зменная сапраўды не вызначана.
дададзена аўтар Adam, крыніца
Дзякуй за выдатныя акуляры. Акрамя таго, ён дапамог умацаваць сваё ўласнае разуменне, і я абнавіў свой адказ, каб адлюстраваць вашыя каментары.
дададзена аўтар David L, крыніца
<�Код>, калі (window.variableName) мае вялікі недахоп у тым, што ён будзе вяртаць ілжывы адмоўны вынік для ўсяго, што мае быў вызначаны, але falsy. Такім чынам, любыя зменныя, якія з'яўляюцца хлусня , 0 , '' , нулявым , або іншыя будуць даваць няправільны вынік.
дададзена аўтар Andrzej Doyle, крыніца

Калі вы хочаце, каб праверыць, ці з'яўляецца пераменная (скажам, v) было вызначана і не пуста:

if (typeof v !== 'undefined' && v !== null) {
   //Do some operation  
}

Калі вы хочаце, каб праверыць усе falsy значэння, такія як: нявызначанаму , нулявым , '' , 0 , < код> хлусня :

if (v) {
  //Do some operation
}
7
дададзена

Я пішу адказ толькі таму, што ў мяне няма дастаткова рэпутацыі пракаментаваць прыняты адказ ад <�моцнага> apsillers . Я згодны з яго адказам, але

Калі вы сапраўды хочаце, каб праверыць, ці з'яўляецца пераменная неабвешчаная, вам трэба   злавіць ReferenceError ...

гэта не адзіны спосаб. Можна зрабіць проста:

this.hasOwnProperty("bar")

каб праверыць, ці ёсць пераменная <�моцны> бар аб'яўлены ў бягучым кантэксце. (Я не ўпэўнены, але называючы <�моцны> hasOwnProperty таксама можа быць больш хуткімі/эфектыўным, чым падвышэнне выключэнні) Гэта працуе толькі для бягучага кантэксту (не для ўсёй бягучай вобласці).

5
дададзена

Часам вам даводзіцца мець справу з ім у якасці выключэння ReferenceError.

    try {
          //user variable
           console.log(varName);
    }catch(error){
         //variable is not defined
         console.log(error);
    }
2
дададзена
if ( typeof variableName !== 'undefined' && variableName )
//// could throw an error if var doesnt exist at all

if ( window.variableName )
//// could be true if var == 0

////further on it depends on what is stored into that var
// if you expect an object to be stored in that var maybe
if ( !!window.variableName )
//could be the right way

best way => see what works for your case
1
дададзена

if (variable) can be used if variable is guaranteed to be an object, or if false, 0, etc. are considered "default" values (hence equivalent to undefined or null).

typeof variable == 'undefined' can be used in cases where a specified null has a distinct meaning to an uninitialised variable or property. This check will not throw and error is variable is not declared.

0
дададзена

Я знайшоў гэта карацей і нашмат лепш:

    if(varName !== (undefined || null)) { //do something }
0
дададзена