CoffeeScript Tanımsız


89

JavaScript'te bir değişkenin hiç oluşturulup oluşturulmadığını kontrol etmek için, biz sadece

if (typeof MyVariable !== "undefined"){ ... }

Kahve kağıdında bunu nasıl yaparım merak ediyordum? ... gibi bir şey deniyorum

if (MyVariable?false){ ... }

ancak bu MyVariable, eğer öyleyse MyVariable (false) 'ı çağıracak bir işlev olup olmadığını kontrol edin , bu değilse void (0) veya benzeri bir şey çağırır.



if MyVariable isnt undefinedHangisinin ürettiğini deneyin if (MyVariable !== void 0).
Yami Odymel

Yanıtlar:


163

Sonunda bunu yapmanın şu kolay yolunu buldum:

if (MyVariable?){ ... }

oluşturacak:

if (typeof MyVariable !== "undefined" && MyVariable !== null){ ... }

GÜNCELLEME 04/07/2014 Demo Bağlantısı

görüntü açıklamasını buraya girin


58
Aslında sadece oluşturulduitem != null
Pencilcheck

13
@Pencilcheck - bunun nedeni, derleyicinin öğenin kodunuzda tanımlanmış olduğunu belirlemesidir. (ayrıca, harika bir isim - şimdi benim için tablet kontrolü olsa da :) Bu cevap aynı zamanda tanımsızdan çok farklı olan boş değerleri de alıyor. Farklı bir soruya cevap gibi görünüyor IMHO
Seth

3
@Seth, evet, her zaman bu nüanstan yanarım, bu da bir sonraki mantıksal soruyu gündeme getirir: CS aşağıdakiler için herhangi bir sözdizimsel kısayol sunuyor mu: MyVariable = MyMethod; MyVariable? ... MyMethod dönebilir undefinedmi? Yoksa daha sonra başvurmanız if typeof myVariable isnt 'undefined'mı gerekiyor ?
neverfox

1
@neverfox, bildiğim kadarıyla ikincisi (tanımsız tür denetimi) - CoffeeScript, null ve undefined öğelerinin birleştirilmesi gerektiğini düşünüyor.
Seth

6
@Seth, gerçekten değil. Sigara sıkı karşılaştırmalar ( ==ve !=aslında tedavi) nullve undefinedeşit değerler olarak, yani item != nullaslında hem test nullve undefinedaynı anda. Olarak yazıldıysa değil item !== null.
toriningen

26

İlk olarak sorunuzu cevaplamak için:

if typeof myVariable isnt 'undefined' then # do stuff

Magrangs'ın çözümü, tanımsız ve yanlış arasında ayrım yapmanız gerekmediği sürece (örneğin, myVariable doğru, yanlış veya tanımsız olabilirse) çoğu durumda işe yarayacaktır.

Ve sadece belirtmek için, koşullarınızı parantez içine almamalısınız ve küme parantezi kullanmamalısınız.

thenHer şey aynı satırda ise anahtar kelime aksi kod içindeki durumun ne olduğunu göstermek için girinti kullanmak, kullanılabilir.

if something  
    # this is inside the if-statement  
# this is back outside of the if-statement

Bu yardımcı olur umarım!


isntAnahtar kelime eşdeğerdir !=CoffeeScript içinde ve javascript için kullanılan konum daha okunabilir olabilir.
Aaron Dufour

12
Eşdeğer !==, değil!=
Mischa Arefiev

1
Bu en spesifik cevaptır - diğerlerinin çoğu da boş değerlerle etkileşime girer. Thx
Seth

1
@MischaArefiev !=in Coffee, !==JavaScript'e çevrilir .
Suzana

14

Bu cevap kahve kitabının eski bir versiyonu içindir. Daha güncel bir cevap istiyorsanız yukarıdaki cevaba bakın (Temmuz 2014 itibariyle)

Bu kahve dosyası istediğini yapıyor bence:

if not MyVariable?
  MyVariable = "assign a value"

Hangi üretir:

if (!(typeof MyVariable !== "undefined" && MyVariable !== null)) {
  MyVariable = "assign a value";
}

Not: MyVariableİlk olarak bir atama yaparsanız MyVariable, bu koddaki gibi tanımsız olarak ayarlasanız bile , bu şu şekilde derlenir:

if (!(MyVariable != null)) {
  MyVariable = "assign a value";
}

Bunun işe yaradığına inanıyorum çünkü !=CoffeeScripts Existential Operator(soru işareti) tarafından kullanılanın undefinedeşit olmaya zorlaması null.

ps Gerçekten işe başlayabilir misin if (MyVariable?false){ ... }? Varoluşsal operatör ile false arasında bir boşluk olmadıkça benim için MyVariable? falsederlemez, yani bu da CoffeeScript'in falsesizin için bir parametre olduğunu düşündüğü için onu bir işlev gibi kontrol etmesini sağlar MyVariable, örneğin :

if MyVariable? false
  alert "Would have attempted to call MyVariable as a function"
else
  alert "but didn't call MyVariable as it wasn't a function"

Üretir:

if (typeof MyVariable === "function" ? MyVariable(false) : void 0) {
  alert("Would have attempted to call MyVariable as a function");
} else {
  alert("but didn't call MyVariable as it wasn't a function");
}

3
bu eski kahve betiği. variable?şimdi sadece değişkene derler = null!
Gambai

@Gambai emin misin? Web sitesi hala ... !== null coffeescript.org/#try:variable%3F
AJP

1
Evet, derleyici şimdi bazen bir optimizasyon olarak ! = Undefined değerini atlar çünkü değişken kodda bir yerde tanımlanması gerektiğinde. Diyorum gerektiğini derleyici hep ... düzgün çalışmaması nedeniyle
Suzana

@Suzana_K bilmek güzel. Eminim bu soru ile karşılaşan insanlar güncel bir cevap isteyecektir, lütfen benimkini düzenlemekten veya yeni bir cevap göndermekten çekinmeyin, ben de ona en baştan bağlantı vereceğim. ES6 / TypeScript'i benimsedikten sonra artık CoffeeScript kullanmıyorum, bu yüzden cevabı güncelleyemiyorum. Görünüşe göre Jaider'in cevabı bunu kapsıyor: stackoverflow.com/a/10238211/539490
AJP


9

Jaider'ın yukarıdaki cevabına ek olarak (yetersiz itibar nedeniyle yorum yapamadım) , eğer bir nesne / dizi içinde bir şey ise bunun farklı bir durum olmasına dikkat edin:

someArray['key']?

şuna dönüştürülecek:

someArray['key'] != null

Js2coffee.org'dan ekran görüntüsü :

js2coffee.org


Anahtarın var olup olmadığını kontrol ediyorsunuz, bu yüzden bu mantıklı. Dizinin var olup olmadığını da kontrol etmeniz gerekiyorsa, someArray? ['Key']?
Joshua Davison

6

Ben sadece kullanıyorum:

if (myVariable)
    //do stuff

Undefined yanlış olduğu için, sadece myVariable tanımsız değilse işler yapar.

Sadece 0, "" ve boş değerler için "işler" yapacağının farkında olmalısınız


1
Sürece ben bu yöntemi tercih myVariablegibi falsy değerini izin verilmez nullya 0.
Bryan Downing

3

Tanımlanmamış ve boş olmayan bir değişkene değişken atamanın en temiz yolu şunu kullanmaktır unless:

unless ( myVar? )
    myVar = 'val'

6
myVar ?= 'val'
Ricket

2

Neden OR deyimini kullanmıyorsunuz?

myVar or 'val'

Dolayısıyla, tanımsız olmadığı sürece sonuç myVar'a eşit olacaktır, bu durumda 'val' değerine eşit olacaktır.


3
Dahil - bu deyim ile herhangi falsish değer 'val' yerine bu olması gerekiyordu ne varsa dönecektir '', 0.0ve false. Bu muhtemelen istenmeyen değil.
toriningen
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.