CoffeeScript Undefined

89

W javascript, aby sprawdzić, czy zmienna nigdy nie została utworzona, po prostu robimy

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

Zastanawiałem się, jak to zrobić w skrypcie kawowym? ... Próbuję czegoś takiego

if (MyVariable?false){ ... }

ale to sprawdzenie, czy MyVariablejest funkcją, jeśli tak, to wywoła MyVariable (false), jeśli nie, to wywoła void (0) lub coś w tym rodzaju.

Jaider
źródło
Spróbuj, if MyVariable isnt undefinedktóry produkuje if (MyVariable !== void 0).
Yami Odymel

Odpowiedzi:

163

Wreszcie znalazłem na to prosty sposób:

if (MyVariable?){ ... }

który wygeneruje:

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

AKTUALIZACJA 04/07/2014 Łącze demonstracyjne

wprowadź opis obrazu tutaj

Jaider
źródło
58
Właściwie to tylko wygenerowałoitem != null
Pencilcheck
13
@Pencilcheck - to dlatego, że kompilator ustalił, że element został zdefiniowany w kodzie. (też świetna nazwa - chociaż to dla mnie teraz sprawdź tablet :) Ta odpowiedź również zawiera wartości null, które są bardzo różne od undefined. Wydaje się, że to odpowiedź na inne pytanie IMHO
Seth
3
@Seth, tak, cały czas palę ten niuans, co rodzi kolejne logiczne pytanie: czy CS oferuje jakiś skrót syntaktyczny do następujących czynności: MyVariable = MyMethod; if MyVariable? ... gdzie MyMethod może zwrócić undefined? A może musisz się wtedy uciec if typeof myVariable isnt 'undefined'?
neverfox,
1
@neverfox to drugie, o ile wiem (undefined type check) - CoffeeScript uważa, że ​​null i undefined powinny być połączone.
Seth
6
@Seth, niezupełnie. Porównania nieścisłe ( ==i !=) w rzeczywistości traktują nulli undefinedjako równe wartości, więc w item != nullrzeczywistości testuje zarówno dla, jak nulli undefinedjednocześnie. Nie, jeśli jest napisane jako item !== null.
toriningen
26

Po pierwsze, aby odpowiedzieć na twoje pytanie:

if typeof myVariable isnt 'undefined' then # do stuff

Rozwiązanie Magrangsa zadziała w większości przypadków, z wyjątkiem sytuacji, gdy trzeba rozróżnić między niezdefiniowanymi a fałszywymi (na przykład, jeśli mojaZmienna może mieć wartość prawda, fałsz lub nieokreślona).

Aby zaznaczyć, nie powinieneś zawijać warunków w nawiasach i nie powinieneś używać nawiasów klamrowych.

Słowa thenkluczowego można użyć, jeśli wszystko znajduje się w tym samym wierszu, w przeciwnym razie użyj wcięcia, aby wskazać, jaki kod znajduje się w warunku.

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

Mam nadzieję że to pomoże!

soundlikeneon
źródło
isntKluczowe jest równoważne !=w coffeescript i może być bardziej czytelny, jeśli jesteś przyzwyczajony do javascript.
Aaron Dufour
12
Odpowiednik !==, nie!=
Mischa Arefiev
1
To jest najbardziej szczegółowa odpowiedź - wiele innych również wchodzi w interakcje z wartościami null. Thx
Seth,
1
@MischaArefiev !=in Coffee, co przekłada się !==na JavaScript.
Suzana
14

Ta odpowiedź dotyczy starszej wersji Coffeescript. Zobacz odpowiedź Jaidera powyżej, jeśli chcesz uzyskać bardziej aktualną odpowiedź (stan na lipiec 2014)

Myślę, że ten skrypt kawowy robi to, co chcesz:

if not MyVariable?
  MyVariable = "assign a value"

Który produkuje:

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

Uwaga, jeśli dokonasz przypisania do MyVariablefirst, nawet jeśli ustawisz wartość MyVariableundefined, jak w tym kodzie , to kompiluje się do:

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

Uważam, że to działa, ponieważ !=używany przez CoffeeScripts Existential Operator(znak zapytania) wymusza undefinedrówność null.

ps Czy faktycznie możesz zabrać się if (MyVariable?false){ ... }do pracy? Nie kompiluje się dla mnie, chyba że istnieje spacja między operatorem egzystencjalnym a fałszem, MyVariable? falseco powoduje, że CoffeeScript sprawdza go jak funkcję, z powodu tego, falseco uważa za parametr dla twojego MyVariable, na przykład :

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"

Produkuje:

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");
}
AJP
źródło
3
to jest stary skrypt do kawy. the variable?now only kompiluje się do zmiennej! = null
Gambai
@Gambai czy na pewno? Strona nadal pokazuje ... !== null coffeescript.org/#try:variable%3F
AJP
1
Tak, teraz kompilator czasami pomija ! = Undefined jako optymalizację, ponieważ zmienna powinna być zdefiniowana gdzieś w kodzie. Mówię powinny , ponieważ kompilator nie zawsze działa poprawnie ...
Suzana
@Suzana_K Dobrze wiedzieć. Jestem pewien, że ludzie, którzy napotkają to pytanie, chcieliby aktualnej odpowiedzi, nie krępuj się edytować mojego lub opublikować nową odpowiedź, a ja umieszczę link do niego u góry mojego. Nie używam już CoffeeScript po przyjęciu ES6 / TypeScript, więc nie mogę zaktualizować odpowiedzi. Właściwie wygląda na to, że odpowiedź Jaidera obejmuje to: stackoverflow.com/a/10238211/539490
AJP
11
typeof MyVariable isnt "undefined" 

z js2coffee

Jonathan
źródło
9

Oprócz odpowiedzi Jaidera powyżej (nie mogłem komentować z powodu niewystarczającej reputacji) , uważaj, że jest inaczej, jeśli jest to coś wewnątrz obiektu / tablicy:

someArray['key']?

zostanie przekonwertowany na:

someArray['key'] != null

Zrzut ekranu z js2coffee.org :

js2coffee.org

LongYC
źródło
Sprawdzasz, czy klucz istnieje, więc to ma sens. Jeśli chcesz również sprawdzić, czy tablica istnieje, wypróbuj someArray? ['Key']?
Joshua Davison
6

Po prostu używam:

if (myVariable)
    //do stuff

Ponieważ undefined jest fałszywa, będzie działać tylko wtedy, gdy myVariable nie jest niezdefiniowana.

Musisz tylko być świadomy, że zrobi to dla wartości 0, „” i null

Magrangs
źródło
1
Wolę tę metodę, o ile myVariablenie może być fałszywą wartością, taką jak nulllub 0.
Bryan Downing
3

Najczystszym sposobem przypisania zmiennej do niezdefiniowanej i niezerowej zmiennej jest użycie unless:

unless ( myVar? )
    myVar = 'val'
oszukiwanie
źródło
6
myVar ?= 'val'
Ricket
2

Dlaczego nie użyć po prostu idiomu OR?

myVar or 'val'

Tak więc wynik będzie równy myVar, chyba że jest on nieokreślony, w którym to przypadku będzie równy „val”.

l3x
źródło
3
Z tego idiomu dowolna wartość falsish powróci „val” zamiast cokolwiek to miało być - w tym '', 0.0i false. Co prawdopodobnie nie jest niepożądane.
toriningen