JavaScriptÔÇÖte ÔÇťtan─▒ms─▒zÔÇŁ nas─▒l kontrol edilir? [├žift]


Al─▒nan cevaba git


Bir de─či┼čkenin JavaScript'te tan─▒ms─▒z olup olmad─▒─č─▒n─▒ test etmenin en uygun yolu nedir? Birka├ž olas─▒ yol g├Ârd├╝m:

 if (window.myVariable)
 

Veya

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

Veya

 if (myVariable) //This throws an error if undefined. Should this be in Try/Catch?
 

2257









Cevap say─▒s─▒n─▒ say: 16






De─čerinden ba─č─▒ms─▒z olarak bir de─či┼čkenin bildirilip bildirilmedi─čini ├Â─črenmekle ilgileniyorsan─▒z, in i┼čleci kullanmak en g├╝venli yoldur. Bu ├Ârne─či d├╝┼č├╝n├╝n.

 // global scope
var theFu; // theFu has been declared, but its value is undefined
typeof theFu; // "undefined"
 

Ancak bu, baz─▒ durumlar i├žin ama├žlanan sonu├ž olmayabilir, ├ž├╝nk├╝ de─či┼čken veya ├Âzellik bildirildi, ancak hen├╝z ba┼člat─▒lmad─▒. in Daha sa─člam bir kontrol i├žin operat├Âr├╝ kullan─▒n .

 "theFu" in window; // true
"theFoo" in window; // false
 

De─či┼čkenin bildirilmedi─čini veya de─čeri olup olmad─▒─č─▒n─▒ bilmekle ilgileniyorsan─▒z undefined , typeof i┼čleci kullan─▒n .

 if (typeof myVar !== 'undefined')
 

typeof Operat├Âr bir dize d├Ând├╝rmek i├žin garanti edilir. Do─črudan kar┼č─▒la┼čt─▒rmalar ├╝zerine yaz─▒labilece─či undefined gibi s─▒k─▒nt─▒l─▒ undefined .

 window.undefined = "omg";
"omg" == undefined // true
 

@ CMS'nin i┼čaret etti─či gibi, bu ECMAScript 5'inci bas─▒m─▒na eklenmi┼čtir ve undefined yaz─▒labilir de─čildir.

if (window.myVar) Ayr─▒ca bu sahte de─čerleri de i├žerecektir, bu y├╝zden ├žok sa─člam de─čil:

yanl─▒┼č
0
""
NaN
bo┼č
Tan─▒ms─▒z

├ť├ž├╝nc├╝ vakan─▒z─▒n - if (myVariable) iki vakada da bir hataya neden olabilece─čine i┼čaret etti─či i├žin @ CMS sayesinde . Birincisi, de─či┼čkenin tan─▒mlanmad─▒─č─▒, yani a atan ReferenceError .

 // abc was never declared.
if (abc) {
    // ReferenceError: abc is not defined
} 
 

Di─čer durum, de─či┼čken tan─▒mland─▒─č─▒nda ancak ├ža─čr─▒ld─▒─č─▒nda hata atan bir al─▒c─▒ i┼člevi vard─▒r. ├ľrne─čin,

 // or it's a property that can throw an error
Object.defineProperty(window, "myVariable", { 
    get: function() { throw new Error("W00t?"); }, 
    set: undefined 
});
if (myVariable) {
    // Error: W00t?
}
 

2534







┼×ahsen kullan─▒r─▒m

 myVar === undefined
 

Uyar─▒: L├╝tfen === kullan─▒ld─▒─č─▒n─▒ == ve myVar ├Ânceden bildirildi─čini ( tan─▒mlanmad─▒─č─▒n─▒ ) unutmay─▒n.


Ben sevmiyorum typeof myVar === "undefined" . San─▒r─▒m uzun soluk ve gereksiz. (Ayn─▒s─▒n─▒ daha az kodda yapabilirim.)

┼×imdi baz─▒ insanlar bunu okuduklar─▒nda ac─▒ ├žekecekler, ├ž─▒─čl─▒k at─▒yorlar: ÔÇťBekle! WAAITTT !!! undefined yeniden tan─▒mlanabilir!ÔÇŁ

G├╝zel. Bunu biliyorum. Sonra tekrar, Javascript'teki de─či┼čkenlerin ├žo─ču yeniden tan─▒mlanabilir. Asla yeniden tan─▒mlanabilecek yerle┼čik bir tan─▒mlay─▒c─▒ kullanmamal─▒ m─▒yd─▒n─▒z?

Bu kurala uyarsan─▒z, sizin i├žin iyi: ikiy├╝zl├╝ de─čilsinizdir.

─░┼čin asl─▒, JS'de bir├žok ger├žek i┼č yapmak i├žin, geli┼čtiricilerin olduklar─▒ gibi yeniden tan─▒mlanabilir tan─▒mlay─▒c─▒lara g├╝venmeleri gerekir. ─░nsanlar─▒n bana kullanmamam gerekti─čini s├Âylediklerini duymuyorum setTimeout ├ž├╝nk├╝ biri yapabilir

 window.setTimeout = function () {
    alert("Got you now!");
};
 

Alt sat─▒rda, "yeniden tan─▒mlanabilir" arg├╝man─▒ bir ham kullanmamakt─▒r === undefined .

(Yeniden undefined tan─▒mlanmaktan hala korkuyorsan─▒z , neden test edilmemi┼č k├╝t├╝phane kodunu kod taban─▒n─▒za k├Âr bir ┼čekilde b├╝t├╝nle┼čtiriyorsunuz? Ya da daha basit: bir astarlama arac─▒.)


Ayr─▒ca, typeof yakla┼č─▒m gibi , bu teknik bildirilmemi┼č de─či┼čkenleri "alg─▒layabilir":

 if (window.someVar === undefined) {
    doSomething();
}
 

Ancak her iki teknik de soyutlamalar─▒nda s─▒z─▒nt─▒ yap─▒yor. Bunu kullanmaman─▒ ya da hatta kullanma

 if (typeof myVar !== "undefined") {
    doSomething();
}
 

D├╝┼č├╝nmek:

 var iAmUndefined;
 

Bu de─či┼čkenin bildirilip bildirilmedi─čini anlamak i├žin in operat├Âre ba┼čvurman─▒z gerekebilir . (├ço─ču durumda, sadece O_o kodunu okuyabilirsiniz).

 if ("myVar" in window) {
    doSomething();
}
 

Fakat bekle! Fazlas─▒ var! Ya baz─▒ prototip zincir sihri oluyorsa ...? ┼×imdi bile ├╝st├╝n in operat├Âr bile yeterli de─čil. (Tamam, bu b├Âl├╝m hakk─▒nda zaman─▒m─▒n% 99'unda === undefined (ve **** ├Âks├╝r├╝k **** typeof ) gayet iyi ├žal─▒┼čt─▒─č─▒n─▒ s├Âylemek d─▒┼č─▒nda i┼čim bitmi┼čtir . Ger├žekten umursuyorsan─▒z, bu konuyu okuyabilirsiniz. Kendi.)


1077







Kullanmak typeof benim tercihim. De─či┼čken daha ├Ânce bildirilmedi─činde, i┼čle├žlerle ya == da === i┼čle├žle ya da bask─▒ kullanarak zorlamalarla kar┼č─▒la┼čt─▒r─▒lmad─▒k├ža ├žal─▒┼čacakt─▒r if . ( undefined aksine null , ECMAScript 3 ortamlar─▒nda da yeniden tan─▒mlanabilir, bu da neredeyse t├╝m ortak ortamlar ECMAScript 5 veya ├╝st├╝ ile uyumlu olmas─▒na ra─čmen kar┼č─▒la┼čt─▒rma i├žin g├╝venilir de─čildir).

 if (typeof someUndeclaredVariable == "undefined") {
    // Works
}

if (someUndeclaredVariable === undefined) { 
    // Throws an error
}
 

176







Kullanman gerek typeof .

 if (typeof something != "undefined") {
    // ...
}
 

61







2018-07-25 G├╝ncellemesi

Bu g├Ânderinin ilk yap─▒lmas─▒ndan bu yana yakla┼č─▒k be┼č y─▒l ge├žti ve JavaScript ├žok yol kat etti. Orijinal g├Ânderideki testleri tekrarlarken, a┼ča─č─▒daki test y├Ântemleri aras─▒nda tutarl─▒ bir fark bulamad─▒m:

  • abc === undefined
  • abc === void 0
  • typeof abc == 'undefined'
  • typeof abc === 'undefined'

Chrome'un bunlar─▒ optimize etmesini ├Ânlemek i├žin testleri de─či┼čtirdi─čim zaman bile, farklar ├Ânemsizdi. Gibi, ┼čimdi abc === undefined netlik i├žin tavsiye ederim .

─░lgili i├žerik chrome://version :

  • Google Chrome: 67.0.3396.99 (Resmi Yap─▒) (64-bit) (kohort: Kararl─▒)
  • D├╝zeltme: a337fbf3c2ab8ebc6b64b0bfdce73a20e2e2252b-refs / ┼čube kafalar─▒ / 3396 @ {# 790}
  • ─░┼čletim Sistemi: Windows
  • JavaScript: V8 6.7.288.46
  • Kullan─▒c─▒ Temsilcisi: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 67.0.3396.99 Safari / 537.36

Orijinal yay─▒n 2013-11-01

Google Chrome'da, a┼ča─č─▒dakiler bir typeof testten ├žok daha h─▒zl─▒yd─▒ :

 if (abc === void 0) {
    // Undefined
}
 

Fark ihmal edilebilirdi. Ancak, bu kod daha k─▒sa ve bir bak─▒┼čta ne void 0 anlama geldi─čini bilen birine daha a├ž─▒k . Ancak, bunun abc hala bildirilmesi gerekti─čini unutmay─▒n .

Hem typeof ve void kar┼č─▒ do─črudan kar┼č─▒la┼čt─▒rmaktan daha ├Ânemli ├Âl├ž├╝de daha h─▒zl─▒ idi undefined . Chrome geli┼čtirici konsolunda a┼ča─č─▒daki test bi├žimini kulland─▒m:

 var abc;
start = +new Date();
for (var i = 0; i < 10000000; i++) {
    if (TEST) {
        void 1;
    }
}
end = +new Date();
end - start;
 

Sonu├žlar a┼ča─č─▒daki gibidir:

 Test: | abc === undefined      abc === void 0      typeof abc == 'undefined'
------+---------------------------------------------------------------------
x10M  |     13678 ms               9854 ms                 9888 ms
  x1  |    1367.8 ns              985.4 ns                988.8 ns
 

─░lk sat─▒r─▒n mil saniye cinsinden, ikinci sat─▒r─▒n nano saniye cinsinden oldu─čuna dikkat edin . 3.4 nanosaniyelik bir fark yok. Sonraki testlerde zamanlar olduk├ža tutarl─▒yd─▒.


41







E─čer tan─▒ms─▒zsa, tan─▒ms─▒z olmad─▒─č─▒ i├žin "tan─▒ms─▒z" karakterlerini i├žeren bir dizeye e┼čit olmayacakt─▒r.

De─či┼čkenin t├╝r├╝n├╝ kontrol edebilirsiniz:

 if (typeof(something) != "undefined") ...
 

Bazen t├╝r├╝n├╝ kontrol etmeniz bile gerekmez. De─či┼čkenin de─čeri, ayarland─▒─č─▒nda false olarak de─čerlendiremezse (├Ârne─čin, bir i┼člev ise), o zaman de─či┼čkeni de─čerlendirebilirsiniz. ├ľrnek:

 if (something) {
  something(param);
}
 

21







 if (typeof foo == 'undefined') {
 // Do something
};
 

Her zaman bir dize d├Ând├╝rece─činden kat─▒ kar┼č─▒la┼čt─▒rma ( !== ) uygulamas─▒n─▒n gerekli olmad─▒─č─▒n─▒ unutmay─▒n typeof .


17







├çe┼čitli cevaplar─▒n sonu├žlar─▒n─▒ g├Âsteren baz─▒ senaryolar: http://jsfiddle.net/drzaus/UVjM4/

(Not kullan─▒m─▒ bu var i├žin in testler bir fark oldu─čunda, bir kapsaml─▒ sarg─▒ i├žinde)

Referans kodu:

 (function(undefined) {
    var definedButNotInitialized;
    definedAndInitialized = 3;
    someObject = {
        firstProp: "1"
        , secondProp: false
        // , undefinedProp not defined
    }
    // var notDefined;

    var tests = [
        'definedButNotInitialized in window',
        'definedAndInitialized in window',
        'someObject.firstProp in window',
        'someObject.secondProp in window',
        'someObject.undefinedProp in window',
        'notDefined in window',

        '"definedButNotInitialized" in window',
        '"definedAndInitialized" in window',
        '"someObject.firstProp" in window',
        '"someObject.secondProp" in window',
        '"someObject.undefinedProp" in window',
        '"notDefined" in window',

        'typeof definedButNotInitialized == "undefined"',
        'typeof definedButNotInitialized === typeof undefined',
        'definedButNotInitialized === undefined',
        '! definedButNotInitialized',
        '!! definedButNotInitialized',

        'typeof definedAndInitialized == "undefined"',
        'typeof definedAndInitialized === typeof undefined',
        'definedAndInitialized === undefined',
        '! definedAndInitialized',
        '!! definedAndInitialized',

        'typeof someObject.firstProp == "undefined"',
        'typeof someObject.firstProp === typeof undefined',
        'someObject.firstProp === undefined',
        '! someObject.firstProp',
        '!! someObject.firstProp',

        'typeof someObject.secondProp == "undefined"',
        'typeof someObject.secondProp === typeof undefined',
        'someObject.secondProp === undefined',
        '! someObject.secondProp',
        '!! someObject.secondProp',

        'typeof someObject.undefinedProp == "undefined"',
        'typeof someObject.undefinedProp === typeof undefined',
        'someObject.undefinedProp === undefined',
        '! someObject.undefinedProp',
        '!! someObject.undefinedProp',

        'typeof notDefined == "undefined"',
        'typeof notDefined === typeof undefined',
        'notDefined === undefined',
        '! notDefined',
        '!! notDefined'
    ];

    var output = document.getElementById('results');
    var result = '';
    for(var t in tests) {
        if( !tests.hasOwnProperty(t) ) continue; // bleh

        try {
            result = eval(tests[t]);
        } catch(ex) {
            result = 'Exception--' + ex;
        }
        console.log(tests[t], result);
        output.innerHTML += "\n" + tests[t] + ": " + result;
    }
})();
 

Ve sonu├žlar:

 definedButNotInitialized in window: true
definedAndInitialized in window: false
someObject.firstProp in window: false
someObject.secondProp in window: false
someObject.undefinedProp in window: true
notDefined in window: Exception--ReferenceError: notDefined is not defined
"definedButNotInitialized" in window: false
"definedAndInitialized" in window: true
"someObject.firstProp" in window: false
"someObject.secondProp" in window: false
"someObject.undefinedProp" in window: false
"notDefined" in window: false
typeof definedButNotInitialized == "undefined": true
typeof definedButNotInitialized === typeof undefined: true
definedButNotInitialized === undefined: true
! definedButNotInitialized: true
!! definedButNotInitialized: false
typeof definedAndInitialized == "undefined": false
typeof definedAndInitialized === typeof undefined: false
definedAndInitialized === undefined: false
! definedAndInitialized: false
!! definedAndInitialized: true
typeof someObject.firstProp == "undefined": false
typeof someObject.firstProp === typeof undefined: false
someObject.firstProp === undefined: false
! someObject.firstProp: false
!! someObject.firstProp: true
typeof someObject.secondProp == "undefined": false
typeof someObject.secondProp === typeof undefined: false
someObject.secondProp === undefined: false
! someObject.secondProp: true
!! someObject.secondProp: false
typeof someObject.undefinedProp == "undefined": true
typeof someObject.undefinedProp === typeof undefined: true
someObject.undefinedProp === undefined: true
! someObject.undefinedProp: true
!! someObject.undefinedProp: false
typeof notDefined == "undefined": true
typeof notDefined === typeof undefined: true
notDefined === undefined: Exception--ReferenceError: notDefined is not defined
! notDefined: Exception--ReferenceError: notDefined is not defined
!! notDefined: Exception--ReferenceError: notDefined is not defined
 

17







Gelen bu makalede ben gibi o ├žer├ževeler okumak Underscore.js bu i┼člevi kullan─▒n:

 function isUndefined(obj){
    return obj === void 0;
}
 

15







┼×ahsen ben her zaman a┼ča─č─▒dakileri kullan─▒n:

 var x;
if( x === undefined) {
    //Do something here
}
else {
   //Do something else here
}
 

Window.undefined ├Âzelli─či, t├╝m modern taray─▒c─▒larda yaz─▒lamaz (JavaScript 1.8.5 veya ├╝st├╝). Mozilla'n─▒n dok├╝mantasyonundan: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined , ┼čunu g├Âr├╝yorum: typeof () kullanman─▒n bir nedeni, e─čer hata yapmazsa de─či┼čken tan─▒mlanmad─▒.

Kullanma yakla┼č─▒m─▒na sahip olmay─▒ tercih ederim

 x === undefined 
 

├ž├╝nk├╝ daha ├Ânce x bildirilmezse sessizce ge├žip / ba┼čar─▒s─▒z olmak yerine y├╝z├╝mde ba┼čar─▒s─▒z ve patlar. Bu x bildirilmez oldu─čunu beni uyar─▒r. JavaScript'te kullan─▒lan t├╝m de─či┼čkenlerin bildirilmesi gerekti─čine inan─▒yorum.


12







Kontrol etmenin en g├╝venilir yolu undefined kullanmak void 0 .

Bu hem yeni hem de eski taray─▒c─▒larla uyumludur ve window.undefined baz─▒ durumlarda oldu─ču gibi ├╝zerine yaz─▒lamaz .

 if( myVar === void 0){
    //yup it's undefined
}
 

10







Di─čer cevaplar─▒n hi├žbiri bana yard─▒mc─▒ olmad─▒─č─▒ndan, bunu yapmay─▒ ├Âneriyorum. Internet Explorer 8'de benim i├žin ├žal─▒┼čt─▒:

 if (typeof variable_name.value === 'undefined') {
    // variable_name is undefined
}
 

4







 // x has not been defined before
if (typeof x === 'undefined') { // Evaluates to true without errors.
   // These statements execute.
}

if (x === undefined) { // Throws a ReferenceError

}
 

4







     var x;
    if (x === undefined) {
        alert ("I am declared, but not defined.")
    };
    if (typeof y === "undefined") {
        alert ("I am not even declared.")
    };

    /* One more thing to understand: typeof ==='undefined' also checks 
       for if a variable is declared, but no value is assigned. In other 
       words, the variable is declared, but not defined. */

    // Will repeat above logic of x for typeof === 'undefined'
    if (x === undefined) {
        alert ("I am declared, but not defined.")
    };
    /* So typeof === 'undefined' works for both, but x === undefined 
       only works for a variable which is at least declared. */

    /* Say if I try using typeof === undefined (not in quotes) for 
       a variable which is not even declared, we will get run a 
       time error. */

    if (z === undefined) {
        alert ("I am neither declared nor defined.")
    };
    // I got this error for z ReferenceError: z is not defined 
 

3







@Thomas Eding cevab─▒n─▒n aksine:

Kodumda bildirmeyi unutursam myVar , o zaman al─▒r─▒m myVar is not defined .

Ger├žek bir ├Ârnek alal─▒m:

De─či┼čken bir ad─▒m var, ancak bir yerde bildirilip bildirilmedi─činden emin de─čilim.

O zaman @ Anurag'─▒n cevab─▒ yard─▒mc─▒ olacakt─▒r:

 var myVariableToCheck = 'myVar';
if (window[myVariableToCheck] === undefined)
    console.log("Not declared or declared, but undefined.");

// Or you can check it directly 
if (window['myVar'] === undefined) 
    console.log("Not declared or declared, but undefined.");
 

3







Bir i┼člev parametresi olarak kullan─▒yorum ve bu ┼čekilde "real" undefined olsun, i┼člev y├╝r├╝tme d─▒┼č─▒nda tutuyorum. Her ne kadar kodunuzu bir fonksiyonun i├žine koyman─▒z─▒ gerektirse de. Bunu jQuery kayna─č─▒n─▒ okurken buldum.

 undefined = 2;

(function (undefined) {
   console.log(undefined); // prints out undefined
   // and for comparison:
   if (undeclaredvar === undefined) console.log("it works!")
})()
 

Tabii ki sadece kullanabilirsiniz typeof . Fakat kodumun t├╝m├╝ genellikle zaten bir i├žerme fonksiyonunun i├žindedir, bu y├╝zden bu metodu kullanmak muhtemelen bana burada ve burada birka├ž bayt kazand─▒r─▒r.


0



─░lgili yay─▒nlar


Bo┼č / tan─▒ms─▒z / bo┼č dizgeyi JavaScript'te nas─▒l kontrol edebilirim?

JavaScript'te tan─▒ms─▒z veya bo┼č bir de─či┼čken nas─▒l kontrol edilir?

AngularJs: Dosya giri┼č alanlar─▒ndaki de─či┼čiklikler nas─▒l kontrol edilir?

Twig'de null nas─▒l kontrol edilir?

Dosya kilidi nas─▒l kontrol edilir? [├žift]

Dosya varl─▒─č─▒ nas─▒l kontrol edilir [duplicate]

Ge├žerli bir e-posta adresi nas─▒l kontrol edilir? [├žift]

JavaScript'te tarih / saat nas─▒l ├ž─▒kar─▒l─▒r? [├žift]

String sabitleri JavaScript'te nas─▒l bildirilir? [├žift]

Javascript'te <script> </script> nas─▒l eklenir? [├žift]

Etiketle ilgili di─čer sorular [javascript]


Bir ├Â─čenin d─▒┼č─▒ndaki bir t─▒klamay─▒ nas─▒l tespit ederim?

ÔÇťB├╝y├╝k veriÔÇŁ ├žal─▒┼čmas─▒ pandalar kullanarak ak─▒yor

.Gitconfig'te kendim i├žin birden fazla kullan─▒c─▒ belirleyebilir miyim?

Git'teki iki komisyon aras─▒nda de─či┼čtirilen sat─▒r say─▒s─▒n─▒ nas─▒l hesaplayabilirim?

Bir y─▒─č─▒n izlemesi nedir ve uygulama hatalar─▒m─▒ hata ay─▒klamak i├žin nas─▒l kullanabilirim?

├çok par├žal─▒ / form verilerinde s─▒n─▒r nedir?

Bir dizgede belirli bir dizinde bir karakter de─či┼čtirilsin mi?

IIS Express Web sunucusu ba┼člat─▒lam─▒yor

Ana ge├žerli bir Java tan─▒mlay─▒c─▒s─▒ m─▒?

Linux'ta kod kullanarak bir dosyan─▒n kodlamas─▒n─▒ nas─▒l bulabilirim?