2012-03-29 2 views
80

В JavaScript, чтобы проверить, если переменная не была создана, мы просто делаемCoffeeScript Неопределенное

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

Я удивительно, как я, что в CoffeeScript? ... Я пытаюсь что-то вроде

if (MyVariable?false){ ... } 

но эта проверка, если MyVariable является функцией, если это так, что вызовет MyVariable (false), если это не будет вызвано void (0) или что-то в этом роде.

+0

См. Также [coffeescript не null или undefined] (http://stackoverflow.com/q/20010245/1048572) – Bergi

+0

Попробуйте 'if MyVariable is undefined', который создает' if (MyVariable! == void 0) '. –

ответ

153

Наконец-то я нашел простой способ сделать это:

if (MyVariable?){ ... } 

, который будет генерировать:

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

UPDATE 04/07/2014 Demo Link

enter image description here

+0

Вопросительный знак - это путь. Это в самом первом примере кода кода http://coffeescript.org/ - alert «Я знал это!». если Элвис? –

+54

На самом деле это только сгенерировало 'item! = Null' – Pencilcheck

+12

@Pencilcheck - это потому, что компилятор определил, что элемент был определен в вашем коде. (также, отличное имя - хотя сейчас это проверка планшета :) Этот ответ также отображает нулевые значения, которые сильно отличаются от неопределенных.Кажется, что ответ на другой вопрос IMHO – Seth

6

Я просто использовать:

if (myVariable) 
    //do stuff 

Как неопределенными является falsy он будет делать только вещи, если MYVARIABLE не определено.

Вы просто должны знать, что это будет «делать вещи» для значений, 0 «» и нулевой

+1

Я предпочитаю этот метод, пока 'myVariable' не может быть ложным значением, например' null' или '0'. –

25

Во-первых, чтобы ответить на ваш вопрос:

if typeof myVariable isnt 'undefined' then # do stuff 

Решение Magrangs будет работать в большинстве случаев, за исключением случаев, когда вам нужно различать неопределенные и ложные (например, если myVariable может быть true, false или undefined).

И только чтобы указать, что вы не должны обертывать свои условия в круглых скобках, и вам не следует использовать фигурные скобки.

Ключевое слово then может использоваться, если все находится на одной линии, иначе используйте отступ, чтобы указать, какой код находится внутри условия.

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

Надеюсь, это поможет!

+0

Ключевое слово 'isnt' эквивалентно'! = 'В Coffeescript и может быть более читаемым, если вы привыкли к javascript. –

+12

Эквивалент '! ==', а не '! =' –

+1

Это наиболее конкретный ответ - многие другие также взаимодействуют с нулевыми значениями. Thx – Seth

13

Этот ответ предназначен для более старой версии coffeescript. См Jaider's answer above, если вы хотите более до даты ответа (по состоянию на июль 2014 г.)

This coffeescript делает то, что вы хотите, я думаю:

if not MyVariable? 
    MyVariable = "assign a value" 

Который производит:

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

нотабенеесли вы сделаете задание MyVariable первым, даже если вы установили MyVariable к неопределенным, как и в this code, то это компилируется:

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

Я считаю, что это работает, потому что != используется CoffeeScripts Existential Operator (знак вопроса) принуждают undefined равным null.

p.s. Можете ли вы на самом деле получить if (MyVariable?false){ ... }? Он не компилирует для меня, если нет пробела между экзистенциальным оператором и ложным, т.е. MyVariable? false, который затем делает CoffeeScript проверить его, как функции из-за false, который он считает параметр для MyVariable, for example:

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" 

Производит:

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"); 
} 
+0

Почему голос? – AJP

+3

это старый сценарий кофе. 'variable?' теперь только компилируется в переменную! = null – Gambai

+0

@ Gambai вы уверены? Веб-сайт по-прежнему показывает «...! == null» http://coffeescript.org/#try:variable%3F – AJP

3

чистейшая способ я нашел, чтобы присвоить переменную неопределенной и не-нулевой переменной с помощью unless:

unless (myVar?) 
    myVar = 'val' 
+6

'myVar? = 'Val'' – Ricket

1

Почему бы просто не использовать Идиому ИЛИ?

myVar or 'val' 

Таким образом, результат будет равен MYVAR, если это не определено в этом случае он будет равен «Вэл».

+3

С этой идиомой любое значение falsish вернет' val 'вместо того, что оно должно быть - включая '' '', '0.0' и' false'. Что, вероятно, не нежелательно. – toriningen

9

В дополнение к Jaider's answer выше (я не мог комментировать из-за недостаточной репутации), будьте осторожны, что это другое дело, если это что-то внутри объекта/массива:

someArray['key']? 

будут преобразованы в :

someArray['key'] != null 

Скриншот из js2coffee.org:

js2coffee.org

+0

Вы проверяете, существует ли ключ, так что это имеет смысл. Если вам также нужно проверить, существует ли массив, попробуйте someArray? ['Key']? –

Смежные вопросы