CoffeeScript Неопределенный

89

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

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

Мне было интересно, как это сделать в coffeescript? ... Я пробую что-то вроде

if (MyVariable?false){ ... }

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

Джайдер
источник
См. Также coffeescript not null или undefined
Берги
Попробуйте, if MyVariable isnt undefinedчто производит if (MyVariable !== void 0).
Yami Odymel

Ответы:

163

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

if (MyVariable?){ ... }

что сгенерирует:

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

ОБНОВЛЕНИЕ 07.04.2014 Демо Ссылка

введите описание изображения здесь

Джайдер
источник
58
На самом деле это только сгенерированоitem != null
Pencilcheck
13
@Pencilcheck - это потому, что компилятор определил, что элемент был определен в вашем коде. (также, отличное имя - хотя сейчас для меня это проверка планшета :) Этот ответ также принимает нулевые значения, которые сильно отличаются от undefined. Вроде ответ на другой вопрос ИМХО
Сет
3
@Seth, да, меня все время обжигает этот нюанс, и возникает следующий логичный вопрос: предлагает ли CS какой-либо синтаксический ярлык для следующего: MyVariable = MyMethod; если MyVariable? ... где MyMethod может вернуться undefined? Или надо тогда прибегнуть if typeof myVariable isnt 'undefined'?
neverfox
1
@ Neverfox последний, насколько мне известно (проверка типа undefined) - CoffeeScript считает, что null и undefined должны быть объединены.
Сет,
6
@Seth, не совсем. Нестрогие сравнения ( ==и !=) на самом деле обрабатывают nullи undefinedкак равные значения, поэтому item != nullфактически проверяют и на, nullи undefinedодновременно. Нет, если это написано как item !== null.
toriningen 07
26

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

if typeof myVariable isnt 'undefined' then # do stuff

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

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

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

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

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

звуки
источник
isntКлючевое слово эквивалентно !=в CoffeeScript, и может быть более удобным для чтения , если вы привыкли к JavaScript.
Aaron Dufour
12
Эквивалентно !==, а не!=
Миша Арефьев
1
Это наиболее конкретный ответ - многие другие также взаимодействуют с нулевыми значениями. Спасибо
Сет
1
@MischaArefiev !=в Coffee, что !==в JavaScript переводится как .
Сюзана
14

Это ответ для более старой версии coffeescript. См . Ответ Джайдера выше, если вы хотите получить более свежий ответ (по состоянию на июль 2014 г.)

Думаю, этот кофе-скрипт делает то, что вы хотите:

if not MyVariable?
  MyVariable = "assign a value"

Что производит:

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

Nb, если вы MyVariableсначала выполняете присвоение , даже если вы устанавливаете MyVariableзначение undefined, как в этом коде , то это компилируется в:

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

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

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

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");
}
AJP
источник
3
это старый кофейный сценарий. variable?теперь только компилирует переменной! = NULL
Gambai
@ Гамбай, ты уверен? На веб-сайте по-прежнему отображается ... !== null coffeescript.org/#try:variable%3F
AJP
1
Да, компилятор теперь иногда опускает ! = Undefined как оптимизацию, потому что, когда переменная должна быть определена где-то в коде. Я говорю , следует , потому что компилятор не всегда работает правильно ...
Сюзана
@Suzana_K полезно знать. Я уверен, что люди, которые сталкиваются с этим вопросом, хотели бы получить актуальный ответ, пожалуйста, отредактируйте мой или разместите новый ответ, и я буду ссылаться на него сверху. Я больше не использую CoffeeScript после принятия ES6 / TypeScript, поэтому я не могу обновить ответ. На самом деле это выглядит как обложки ответа Jaider оно: stackoverflow.com/a/10238211/539490
AJP
9

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

someArray['key']?

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

someArray['key'] != null

Скриншот с сайта js2coffee.org :

js2coffee.org

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

Я просто использую:

if (myVariable)
    //do stuff

Поскольку undefined является ложным, он будет делать что-то, только если myVariable не undefined.

Вы просто должны знать, что он будет "делать что-то" для значений 0, "" и null.

Магранг
источник
1
Я предпочитаю этот метод, если myVariableне допускается использование ложных значений, таких как nullили 0.
Брайан Даунинг
3

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

unless ( myVar? )
    myVar = 'val'
обман
источник
6
myVar ?= 'val'
Ricket
2

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

myVar or 'val'

Таким образом, результат будет равен myVar, если он не определен, и в этом случае он будет равен val.

l3x
источник
3
С этой идиомы любое falsish значение будет возвращать «Вал» вместо того , чтобы все , что должно быть - в том числе '', 0.0и false. Что, наверное, не нежелательно.
toriningen 07