CoffeeScript невизначений


89

У javascript, щоб перевірити, чи змінна ніколи не створювалася, ми просто робимо

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

Мені було цікаво, як я це роблю в coffeescript? ... Я намагаюся щось подібне

if (MyVariable?false){ ... }

але це перевірте, якщо MyVariableце функція, якщо так, що буде викликати MyVariable (false), якщо ні, то буде викликати void (0) або щось подібне.



Спробуйте if MyVariable isnt undefinedякий виробляє if (MyVariable !== void 0).
Ямі Одімель

Відповіді:


163

Нарешті я знайшов цей простий спосіб зробити це:

if (MyVariable?){ ... }

що генерує:

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

ОНОВИТИ 07.07.2014 Демо-посилання

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


58
Насправді це лише породилоitem != null
Pencilcheck

13
@Pencilcheck - це тому, що компілятор визначив, що елемент був визначений у вашому коді. (також чудове ім'я - хоча це зараз для мене перевірка планшета :) Ця відповідь також визначає нульові значення, які дуже відрізняються від невизначених. Це схоже на відповідь на інше питання ІМХО
Сет

3
@Seth, так, я постійно печуся цим нюансом, що викликає наступне логічне питання: чи пропонує CS будь-який синтаксичний ярлик для наступного: MyVariable = MyMethod; якщо MyVariable? ... куди MyMethod може повернутися undefined? Або тоді ви мусите вдатися до цього if typeof myVariable isnt 'undefined'?
neverfox

1
@neverfox останнє, наскільки мені відомо (перевірка невизначеного типу) - CoffeeScript вважає, що значення null та undefined слід поєднати.
Сет

6
@ Сет, не дуже. Несуворі порівняння ( ==і !=) насправді розглядають nullі undefinedяк рівні значення, тому item != nullнасправді тестують як для, так nullі undefinedодночасно. Це не так, якщо це написано як item !== null.
toriningen

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.
Аарон Дюфур,

12
Еквівалентно !==, ні!=
Міша Ареф’єв

1
Це найбільш конкретна відповідь - багато хто з інших також взаємодіє з нульовими значеннями. Thx
Сет

1
@MischaArefiev !=у каві, що перекладається на !==JavaScript.
Сузана

14

Ця відповідь призначена для попередньої версії coffeescript. Дивіться відповідь Джайдера вище, якщо ви хочете отримати більш сучасну відповідь (станом на липень 2014 року)

Цей coffeescript робить те, що ви хочете, я думаю:

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){ ... }до роботи? Він не компілюється для мене, якщо не існує пробілу між екзистенціальним оператором та 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");
}

3
це старий сценарій кави. variable?тепер тільки компілює змінної! = NULL
Gambai

@Gambai ти впевнений? На веб-сайті все ще відображається ... !== null coffeescript.org/#try:variable%3F
AJP

1
Так, компілятор зараз іноді опускає ! = Undefined як оптимізацію, тому що коли змінна повинна бути визначена десь у коді. Я кажу, що слід, тому що компілятор не завжди працює коректно ...
Сузана

@Suzana_K приємно знати. Я впевнений, що люди, які стикаються з цим запитанням, хотіли б отримати актуальну відповідь. Будь ласка, не соромтеся редагувати мою або публікувати нову відповідь, і я буду посилатися на неї зверху моєї. Я більше не використовую CoffeeScript після прийняття ES6 / TypeScript, тому я не можу оновити відповідь. Насправді це схоже на те, що відповідь Джайдера це охоплює: stackoverflow.com/a/10238211/539490
AJP


9

На додаток до відповіді Джейдера вище (я не міг коментувати через недостатню репутацію) , будьте обережні, щоб це було іншим випадком, якщо це щось всередині об’єкта / масиву:

someArray['key']?

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

someArray['key'] != null

Знімок екрана з js2coffee.org :

js2coffee.org


Ви перевіряєте, чи існує ключ, тож це має сенс. Якщо вам також потрібно перевірити, чи існує масив, спробуйте someArray? ['Key']?
Джошуа Девісон,

6

Я просто використовую:

if (myVariable)
    //do stuff

Оскільки undefined є хибним, він буде робити речі, лише якщо myVariable не є undefined.

Ви просто повинні знати, що це буде "робити речі" для значень 0, "" та null


1
Я віддаю перевагу цьому методу до тих пір, myVariableпоки не дозволяється бути хибним значенням, як nullабо 0.
Bryan Downing

3

Найчистіший спосіб, який я знайшов для присвоєння змінної невизначеній і не нульовій змінній, це використання unless:

unless ( myVar? )
    myVar = 'val'

6
myVar ?= 'val'
Ракет

2

Чому б просто не використовувати ідіому АБО?

myVar or 'val'

Отже, результат буде дорівнювати myVar, якщо він не визначений, і в цьому випадку він буде дорівнювати 'val'.


3
З цієї ідіоми будь falsish значення буде повертати «Вал» замість того , щоб все , що повинно бути - в тому числі '', 0.0і false. Що, мабуть, не є небажаним.
toriningen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.