Değişkenleri tanımsız olarak veya tanımsız olarak bağımsız değişken olarak ayarlayabilir miyim?


304

JavaScript undefinedve nulldeğerler konusunda biraz kafam karıştı .

if (!testvar)Aslında ne yapar ? O test mu undefinedve nullya sadece undefined?

Bir değişken tanımlandıktan sonra onu tekrar temizleyebilir miyim undefined(bu nedenle değişkeni silerim)?

undefinedParametre olarak iletebilir miyim ? Örneğin:

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");

Yanıtlar:


514

Javascript undefined & null konusunda biraz kafam karıştı.

Kafanız karışmasın null. Genellikle mantıklıdır ve diğer komut dosyası dillerinin bant dışı 'null', 'nil' veya 'None' nesnelerine benzer şekilde davranır.

undefined, diğer taraftan, tuhaf bir JavaScript tuhaflık. Bant dışı değerleri temsil eden tek bir nesnedir, aslında ikinci bir benzer ama farklıdır null. Ortaya çıkıyor:

  1. functionİfade listelerindeki bağımsız değişkenler listesinden daha az bağımsız değişken içeren bir işlevi çağırdığınızda , atlanmamış bağımsız değişkenler olarak ayarlanır undefined. Bunu örneğin:

    function dosomething(arg1, arg2) {
        if (arg2===undefined)
        arg2= DEFAULT_VALUE_FOR_ARG2;
        ...
    }
    

    Bu yöntem ile dosomething(1)ve arasındaki farkı söyleyemezsiniz dosomething(1, undefined); arg2her ikisinde de aynı değer olacaktır. Farkı anlamanız gerekiyorsa arguments.length, ancak bunun gibi isteğe bağlı argümanlar yapmak genellikle çok okunabilir değildir.

  2. Bir işlevin hayır değeri varsa return value;, geri döner undefined. Genellikle böyle bir geri dönüş sonucunun kullanılmasına gerek yoktur.

  3. Bir değişkeni var abir blokta ifade alarak, ancak henüz bir değer atamadığınızda bildirirseniz, değişkendir undefined. Yine, buna gerçekten güvenmenize gerek yok.

  4. Ürkütücü typeofoperatör 'undefined', başvurmaya çalıştığınızda normalde olduğu gibi bir hata atmak yerine, işleneni mevcut olmayan basit bir değişken olduğunda geri döner . (Ayrıca, parantez içine alınmış basit bir değişken de verebilirsiniz, ancak var olmayan bir değişkeni içeren tam bir ifade veremezsiniz .) Bunun için de fazla bir kullanım yok.

  5. Bu tartışmalı olan. Var olmayan bir nesnenin özelliğine eriştiğinizde, diğer tüm dillerde olduğu gibi hemen bir hata almazsınız. Bunun yerine bir undefinednesne alırsınız . (Daha sonra bu undefinednesneyi daha sonra komut dosyasında kullanmaya çalıştığınızda, JavaScript'in hemen bir hata atmış olmasından çok daha zor olan garip bir şekilde yanlış gidecektir.)

    Bu genellikle özelliklerin varlığını kontrol etmek için kullanılır:

    if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
       ...do something...
    

    Ancak, undefinedbaşka bir değer gibi atayabileceğiniz için :

    o.prop= undefined;

    aslında orada özelliğin güvenilir olup olmadığını algılamaz. inJavaScript'in orijinal Netscape sürümünde olmayan ancak şu anda her yerde kullanılabilen operatörü kullanmak daha iyidir:

    if ('prop' in o)
        ...
    

Özetle, undefinedherkesi şaşırtan JavaScript'e özgü bir karmaşa. JS'nin daha zarif bir mekanizmaya sahip olmadığı isteğe bağlı işlev argümanlarından ayrı undefinedolarak kaçınılmalıdır. Asla dilin bir parçası olmamalıydı; null(2) ve (3) için iyi çalışırdı ve (4) başlangıçta JavaScript'in istisnaları olmadığı için var olan bir yanlış özelliktir.

if (!testvar)aslında ne yapar ? Tanımsız ve boş mu yoksa sadece tanımsız mı test ediyor?

Böyle bir 'truthiness' karşı test eder false, undefined, null, 0, NaNve boş dizeleri. Ancak bu durumda, evet, gerçekten undefinedendişeleniyor. IMO, bu konuda daha açık olmalı ve diyelim if (testvar!==undefined).

bir değişken tanımlandıktan sonra onu tanımsız olarak temizleyebilir miyim (bu nedenle değişkeni silerim).

Kesinlikle undefinedona atayabilirsiniz , ancak bu değişkeni silmez. Sadece delete object.propertyoperatör işleri gerçekten kaldırır.

deletegerçekten değişkenler yerine özellikler içindir. Tarayıcılar düz bir şekilde kurtulmanıza izin verecektir delete variable, ancak bu iyi bir fikir değildir ve ECMAScript Fifth Edition'ın katı modunda çalışmaz. Çöp toplanabilmesi için bir şeye referans vermek isterseniz, söylemek daha olağan olurdu variable= null.

tanımsız olarak parametre olarak iletebilir miyim?

Evet.


10
Ne harika bir cevap. JavaScript testinde henüz başarısız oldum: perfectionkills.com/javascript-quiz Daha sonra cevabınızı tekrar okuyacağım ve testi tekrar deneyeceğim!
Skilldrick

1
sabit, ta. (Yeniden atama konusunda çok fazla endişelenmeme eğilimindeyim, çünkü bir senaryo genel durumun çözülmesinin imkansız olduğu her şeyi karıştırmak için yeniden tanımlayabileceği pek çok şey var.)
bobince

2
@bobince undefinedbir tek nesnedir? Ne demek istiyorsun? Bu bir ilkel değer, bir nesne değil.
Šime Vidas

2
@Hortitude: Bu nokta (4). Genellikle yapmazdım typeof foo=='undefined'; (4a) global-koklama için kullanılma eğilimindedir, bu durumda açık ve söylemeyi tercih ederim 'foo' in windowveya (4b) undefined-değerinin kendisine karşı test etmeyi tercih eder, bu durumda okunabilir olmayı ve söylemeyi tercih ederim foo===undefined. Teori testi olarak typeofkarşı da 'undefined'yerel değişkenlerin varlığı için koklama: diğer yapılar temin edemeyeceği bir kullanım durumunda olabilir. Ancak gerçekte hangi değişkenlerin yerel olarak bildirildiğini hemen hemen biliyorsunuzdur.
bobince

4
# 2 olan bir uyarı, genellikle returndeyimi olmayan bir işlev döndürür undefined, ancak işlev bir yapıcı ise ( newişleç ile çağrılırsa this), bir returnifade olmamasına rağmen yeni nesneyi ( yapıcı içindeki değeri) döndürür . console.log((function (){}()));döner undefined. console.log((new function (){}()));bir nesneyi döndürür.
Yararsız Kod

18

Değişken artık tanımlanmayacağından hiçbir şeyi tanımsız olarak tanımlayamazsınız (tanımamalısınız?) - sadece bir şeye tanımladınız .

undefinedBir fonksiyona geçemezsiniz (yapmamalısınız?) Boş bir değer iletmek istiyorsanız nullbunun yerine kullanın.

İfadesi if(!testvar)Boole doğru / yanlış değerler için denetler, bu özel bir testler olmadığını testvardeğerlendirir için false. Tanımı gereği nullve undefinedhiçbiri trueveya olarak değerlendirilmemelidir false, ancak JavaScript nullolarak falsedeğerlendirilir ve tanımlanmamış bir değişkeni değerlendirmeye çalıştığınızda hata verir.

undefinedVeya öğelerini düzgün bir şekilde test etmek için nullşunları kullanın:

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

if(testvar === null) { ... }

1
Üçlü eşit tip de denetler, bu nedenle tip zorlaması yapılmaz. Douglas Crockford, tip zorlayıcı operatörlerin ( ==ve !=) kullanılmasını öneriyor .
Skilldrick

3
Bir şeyi tanımsız olarak tanımlayabilirsiniz. var a= undefined. Geçebilirsin fn(undefined). Bir pnesnenin tanımsız özelliği ile tanımlanmış ve olarak ayarlanmış obir özellik arasındaki farkı bulmak istiyorsanız , işleci kullanmanız gerekir . pundefined'p' in o
bobince

1
testvar === undefinedDaha karmaşık olmak yerine test yapmamanın bir nedeni var mı typeof(testvar) === "undefined"?
ddaa

4
typeofTanımsız değişkenler için bir test kullanmanın başka bir iyi nedeni daha vardır : aksine null, undefinedsadece global nesnenin bir özelliğidir ve kendisi yeniden tanımlanabilir. Sadece belirli bir kodlama stilini alır ve eksik bir işaret eşittir ve undefinedsessizce değiştirilir:if (undefined = someVar) {...}
Tim Down

1
@IanGrainger: ECMAScript 5 (tüm tarayıcıların mevcut sürümlerinde uygulanmaktadır) çoğunlukla undefinedglobal nesnenin değişmez bir özelliğini yaparak bunu düzeltir , bu yüzden eskisinden daha güvenlidir. Bununla birlikte, undefinedbir işlev içinde çağrılan değişken bir değişken tanımlamak hala mümkündür , bu nedenle sorun tamamen ortadan kalkmamıştır.
Tim Down

13

Temel fark şudur undefinedve nullfarklı kavramları temsil eder.

Yalnızca nullmevcut olsaydı, nullhantal hata yakalama özelliğini kullanmadığınız sürece kasıtlı olarak değer olarak ayarlanıp ayarlanmadığını veya değerin henüz ayarlanıp ayarlanmadığını belirleyemezsiniz: ör.

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

Ancak, değeri kasıtlı olarak ayarlarsanız null, katı eşitlik undefinedbaşarısız olur ve böylece değerleri nullve undefineddeğerleri ayırt etmenizi sağlar :

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;

"Özet olarak, undefined, herkesin kafasını karıştıran JavaScript'e özgü bir karışıklıktır" gibi önemsiz bir şekilde önemsiz olarak söyleyen kişilere güvenmek yerine referansı buradan inceleyin. Kafanız karıştığından, bu bir karışıklık olduğu anlamına gelmez.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

Bu davranış, JavaScript özgü değildir ve bir boole sonucu olabileceğini genelleştirilmiş kavramı tamamlar true, falsebilinmeyen ( null), hiçbir değer ( undefined) veya bir şeyler ters gitti ( error).

http://en.wikipedia.org/wiki/Undefined_value


Ve yine nullde iyi çalışırdı. a == nullolan trueJavaScript tip zorlama nedeniyle.
sleepwalkerfx

11

Boş değerleri kontrol etmenin en iyi yolu

if ( testVar !== null )
{
    // do action here
}

ve tanımsız için

if ( testVar !== undefined )
{
    // do action here
}

Undefined ile bir değişken atayabilirsiniz.

testVar = undefined;
//typeof(testVar) will be equal to undefined.

1
Boş değerleri kontrol etmenin en iyi yolu kullanmaktır !==, değil!=
MBO

6

EVET, sen yapabilirsiniz tanımsız çünkü edilir tanımlanan tanımsız olarak.

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

senin durumun:

test("value1", undefined, "value2")

kendi tanımsız değişkeninizi de oluşturabilirsiniz :

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined

5

İlk sorunuzu cevaplamak için, not operatörü ( !) verilen değeri bir boole değerine zorlar. Yani null, 0, false, NaNve ""(boş dize) tüm sahte görünecektir.


Ve ayrıca boş dize ve NaN (sayı değil)
MBO

undefinedolarak görünmezse false, 'tanımlı değil' hatası verir.
Tatu Ulmanen

Tatu Ulmanen: doğru değil. global nesnenin bir özelliği olarak bulunduğundan if (undefined) {/* Do stuff*/}hata vermeyecektir undefined. Ne hata verecek gibiif (someUndeclaredVariable) {/* Do stuff*/}
Tim Down

2

JavaScript, bir değişkenin komut satırında tanımsız olarak nasıl ayarlanacağı:

jsUbuntu 12.10'da Java ile gelen javascript komut satırı terminalinde bir değişkeni tanımsız olarak ayarlayın .

el@defiant ~ $ js

js> typeof boo
"undefined"

js> boo
typein:2: ReferenceError: boo is not defined

js> boo=5
5

js> typeof boo
"number"

js> delete(boo)
true

js> typeof boo
"undefined"

js> boo
typein:7: ReferenceError: boo is not defined

Bir değişkeni bir javascript'te tanımsız olarak ayarlarsanız:

Bunu myjs.html dosyasına koyun:

<html>
<body>
    <script type="text/JavaScript">
        document.write("aliens: " + aliens);
        document.write("typeof aliens: " + (typeof aliens));
        var aliens = "scramble the nimitz";
        document.write("found some aliens: " + (typeof aliens));
        document.write("not sayings its aliens but... " + aliens);
        aliens = undefined;
        document.write("aliens deleted");
        document.write("typeof aliens: " + (typeof aliens));
        document.write("you sure they are gone? " + aliens);
    </script>
</body>
</html>

Bunu yazdırır:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

UYARI! Değişkeninizi tanımsız olarak ayarlarken değişkeninizi başka bir değişkene ayarlarsınız. Sinsi bir kişi çalışırsa undefined = 'rm -rf /';, değişkeninizi tanımsız olarak ayarladığınızda, bu değeri alırsınız.

Başlangıçta tanımlanmamış değer uzaylılarını nasıl çıktılandırabileceğimi ve hala çalıştırabileceğini merak ediyor olabilirsiniz. Javascript kaldırma nedeniyle: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html



0

For if (something)ve if (!something)genellikle bir şeyin tanımlanıp tanımlanmadığını kontrol etmek için kullanılır. Örneğin:

if (document.getElementById)

Tanımlayıcı bir boole değerine dönüştürülür, bu nedenle undefinedolarak yorumlanır false. Elbette olarak da yorumlanan diğer değerler (0 ve '' gibi) vardır false, ancak tanımlayıcı makul bir değere sahip olmamalıdır veya böyle bir değere undefined ile aynı şekilde muamele etmekten mutluluk duyarsınız.

Javascript'te deletebir nesnenin bir üyesini silmek için kullanılabilecek bir işleç vardır. Bir değişkenin kapsamına bağlı olarak (diğer bir deyişle global ise) tanımsız yapmak için silebilirsiniz.

undefinedTanımlanmamış bir değişmez kelime olarak kullanabileceğiniz bir anahtar kelime yok . Bir işlev çağrısında parametreleri tanımsız yapmak için atlayabilirsiniz, ancak bu yalnızca işleve daha az parametre göndererek kullanılabilir, ortadaki bir parametreyi atlayamazsınız.


0

Sadece eğlenmek için, bir değişkene "atanmamış" atamanın oldukça güvenli bir yolu. Bunun için bir çarpışma olması, birinin rastgele oluşturulmuş dize ile tam olarak aynı ada sahip Nesne prototipine eklenmesini gerektirir. Rastgele dize üreteci geliştirilebilir eminim, ama ben sadece bu sorudan birini aldı: JavaScript rastgele dize / karakterler oluşturmak

Bu, yeni bir nesne oluşturarak ve üzerinde rasgele oluşturulmuş bir adla bir özelliğe erişmeye çalışarak çalışır ve var olmayacağımızı ve dolayısıyla tanımsız değerine sahip olacağımızı varsayarız.

function GenerateRandomString() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 50; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

var myVar = {}[GenerateRandomString()];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.