CoffeeScript未定義


89

変数が作成されていないかどうかをチェックするJavaScriptでは、次のようにします

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

私はコーヒースクリプトでどうやってそれをするのだろうと思ったのですが…。

if (MyVariable?false){ ... }

しかし、このチェックMyVariableは、関数である場合、MyVariable(false)を呼び出します。そうでない場合、void(0)またはそのようなものを呼び出します。



if MyVariable isnt undefinedどれが生成されるか試してくださいif (MyVariable !== void 0)
Yami Odymel 2017年

回答:


163

最後に、この簡単な方法を見つけました。

if (MyVariable?){ ... }

それは生成されます:

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

UPDATE 2014/07/07 デモリンク

ここに画像の説明を入力してください


58
実際に生成されたのはitem != null
Pencilcheck

13
@Pencilcheck-アイテムがコードで定義されているとコンパイラが判断したためです。(また、素晴らしい名前ですが、今ではタブレットチェックですが:)この回答も、未定義とは非常に異なるnull値を取得します。別の質問の答えのように思える
Seth

3
@Seth、はい、私は常にそのニュアンスに火をつけられます。それは次の論理的な質問を提起します:CSは次の構文的なショートカットを提供しますか:MyVariable = MyMethod; もしMyVariable?... MyMethodが返す可能性がある場所はundefined?それとも、次に頼らなければなりませんif typeof myVariable isnt 'undefined'か?
neverfox

1
@neverfox私が知っている限り後者(未定義の型チェック)-CoffeeScriptはnullと未定義を融合する必要があると考えています。
セス

6
@Seth、そうではない。非厳密な比較(==及び!=実際に治療)nullundefined等しい値としては、それほどitem != null実際の両方をテストnullundefined同時に。と書かれていれば、そうではありませんitem !== null
toriningen 2014

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
に相当、!==ではない!=
Mischa Arefiev 2012年

1
これが最も具体的な答えです。他の多くもnull値と相互作用します。Thx
セス

1
@MischaArefiev !=in Coffee、これ!==はJavaScriptに変換されます。
スザナ2017年

14

この回答は、古いバージョンのcoffeescriptに対するものです。最新の回答が必要な場合は、上記のJaiderの回答を参照してください(2014年7月現在)

このコーヒースクリプトはあなたが私が考えていることをします:

if not MyVariable?
  MyVariable = "assign a value"

生成されるもの:

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

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

3
これは古いコーヒーのスクリプトです。variable?今だけの変数にコンパイル= nullを!
Gambai

@がんばいよろしいですか?ウェブサイトにはまだ... !== null coffeescript.org/#try:variable%3F
AJP

1
はい。コンパイラーは、変数をコード内のどこかに定義する必要があるため、最適化として!= undefinedを省略することがあります。コンパイラーが常に正しく機能するとは限らないので、そうすべきだと思います...
Suzana

@Suzana_K知っておくと良い。この質問に出くわす人々は、最新の回答を望んでいると思います。自由に編集したり、新しい回答を投稿したりしてください。上からリンクします。ES6 / TypeScriptを採用した後、CoffeeScriptを使用しなくなったため、回答を更新できません。実際、それはJaiderの回答がカバーしているように見えます: stackoverflow.com/a/10238211/539490
AJP


9

加えてJaiderの答えは上記の(私は不十分評判によるコメントできない)、オブジェクト/配列内のそれの何かあれば、それは別のケースだということに注意してください:

someArray['key']?

に変換されます:

someArray['key'] != null

js2coffee.orgのスクリーンショット:

js2coffee.org


キーが存在するかどうかを確認しているので、これは理にかなっています。配列が存在するかどうかも確認する必要がある場合は、someArray?['key']?
Joshua Davison

6

私は使用します:

if (myVariable)
    //do stuff

undefinedは偽物であるため、myVariableが未定義でない場合にのみ処理を行います。

0、 ""、nullの値に対して「処理」することを知っておく必要があります


1
またはのmyVariableような偽の値にすることが許可されていない限り、この方法を使用します。null0
ブライアンダウニング2013年

3

私は未定義と非NULLの変数に変数を割り当てるために見つけたクリーンな方法は、使用していますunless

unless ( myVar? )
    myVar = 'val'

6
myVar ?= 'val'
リケット14

2

ORイディオムを使用しないのはなぜですか?

myVar or 'val'

したがって、結果が未定義でない限り、結果はmyVarと等しくなります。


3
含む-このイディオムを持つ任意のfalsish値は「valの」の代わりにそれがすることになって何を返します''0.0false。これはおそらく、望ましくないことではありません。
toriningen 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.