CoffeeScript Tidak Ditentukan

89

Dalam javascript untuk memeriksa apakah suatu variabel tidak pernah dibuat, kita lakukan saja

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

Saya bertanya-tanya bagaimana saya melakukannya di coffeescript? ... Saya mencoba sesuatu seperti

if (MyVariable?false){ ... }

tetapi periksa ini jika MyVariableadalah fungsi jika sehingga akan memanggil MyVariable (salah) jika tidak akan memanggil void (0) atau semacamnya.

Jaider
sumber
Coba if MyVariable isnt undefinedyang menghasilkan if (MyVariable !== void 0).
Yami Odymel

Jawaban:

163

Akhirnya saya menemukan cara mudah untuk melakukannya:

if (MyVariable?){ ... }

yang akan menghasilkan:

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

PERBARUI 04/07/2014 Tautan Demo

masukkan deskripsi gambar di sini

Jaider
sumber
58
Sebenarnya itu hanya dihasilkanitem != null
Pencilcheck
13
@Pencilcheck - itu karena kompilator menentukan bahwa item telah ditentukan dalam kode Anda. (juga, nama yang bagus - meskipun sekarang periksa tablet untuk saya :) Jawaban ini juga mengambil nilai null yang sangat berbeda dari yang tidak ditentukan. Sepertinya jawaban untuk pertanyaan yang berbeda IMHO
Set
3
@ Set, ya, saya selalu merasa terbakar oleh nuansa itu, yang menimbulkan pertanyaan logis berikutnya: apakah CS menawarkan pintasan sintaksis untuk berikut ini: MyVariable = MyMethod; jika MyVariable? ... di mana MyMethod akan kembali undefined? Atau haruskah Anda kemudian menggunakan if typeof myVariable isnt 'undefined'?
neverfox
1
@neverfox yang terakhir sejauh yang saya tahu (pemeriksaan tipe tidak ditentukan) - CoffeeScript berpikir bahwa null dan undefined harus digabungkan.
Seth
6
@ Seth, tidak juga. Perbandingan non-ketat ( ==dan !=) sebenarnya memperlakukan nulldan undefinedsebagai nilai yang setara, jadi item != nullsebenarnya menguji untuk nulldan undefinedpada waktu yang sama. Tidak, jika ditulis sebagai item !== null.
toriningen
26

Pertama, untuk menjawab pertanyaan Anda:

if typeof myVariable isnt 'undefined' then # do stuff

Solusi Magrangs akan berfungsi dalam banyak kasus, kecuali jika Anda perlu membedakan antara tidak terdefinisi dan salah (misalnya, jika myVariable bisa benar, salah, atau tidak terdefinisi).

Dan hanya untuk menunjukkan, Anda tidak boleh membungkus kondisi Anda dalam tanda kurung, dan Anda tidak boleh menggunakan kurung kurawal.

Kata thenkunci dapat digunakan jika semuanya berada pada baris yang sama, jika tidak gunakan lekukan untuk menunjukkan kode apa yang ada di dalam kondisi tersebut.

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

Semoga ini membantu!

soundslikeneon
sumber
The isntkata kunci setara dengan !=di CoffeeScript, dan mungkin lebih mudah dibaca jika Anda terbiasa untuk javascript.
Aaron Dufour
12
Setara dengan !==, tidak!=
Mischa Arefiev
1
Ini adalah jawaban yang paling spesifik - banyak dari jawaban lainnya juga berinteraksi dengan nilai nol. Thx
Seth
1
@MischaArefiev !=di Coffee, yang diterjemahkan menjadi !==JavaScript.
Suzana
14

Jawaban ini untuk coffeescript versi lama. Lihat jawaban Jaider di atas jika Anda menginginkan jawaban yang lebih up to date (per Juli 2014)

Coffeescript ini melakukan apa yang Anda inginkan, saya pikir:

if not MyVariable?
  MyVariable = "assign a value"

Yang menghasilkan:

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

Nb jika Anda membuat tugas MyVariableterlebih dahulu, meskipun Anda menyetel MyVariableke tidak terdefinisi seperti dalam kode ini , maka ini akan dikompilasi ke:

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

Saya percaya ini berhasil karena yang !=digunakan oleh CoffeeScripts Existential Operator(tanda tanya) memaksa undefineduntuk menjadi sama null.

ps Bisakah kamu mulai if (MyVariable?false){ ... }bekerja? Itu tidak dapat dikompilasi untuk saya kecuali ada spasi antara operator eksistensial dan false yaitu MyVariable? falseyang kemudian membuat CoffeeScript memeriksanya seperti fungsi karena falsedianggap sebagai parameter untuk Anda MyVariable, misalnya :

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"

Menghasilkan:

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
sumber
3
ini naskah kopi lama. yang variable?sekarang hanya dikompilasi ke variabel! = null
Gambai
@Gambai apakah kamu yakin? Situs web masih menampilkan ... !== null coffeescript.org/#try:variable%3F
AJP
1
Ya, kompilator sekarang kadang-kadang menghilangkan ! = Undefined sebagai optimasi karena variabel harus didefinisikan di suatu tempat dalam kode. Saya katakan harus karena kompiler tidak selalu bekerja dengan benar ...
Suzana
@Suzana_K senang mengetahuinya. Saya yakin orang-orang yang menemukan pertanyaan ini menginginkan jawaban terbaru, silakan edit jawaban saya atau posting jawaban baru dan saya akan menautkannya dari bagian atas jawaban saya. Saya tidak menggunakan CoffeeScript lagi setelah mengadopsi ES6 / TypeScript jadi saya tidak dapat memperbarui jawabannya. Sebenarnya sepertinya jawaban Jaider mencakupnya: stackoverflow.com/a/10238211/539490
AJP
11
typeof MyVariable isnt "undefined" 

dari js2coffee

Jonathan
sumber
9

Selain jawaban Jaider di atas (saya tidak bisa berkomentar karena reputasi yang tidak mencukupi) , berhati-hatilah bahwa ini kasus yang berbeda jika itu ada di dalam objek / larik:

someArray['key']?

akan diubah menjadi:

someArray['key'] != null

Tangkapan layar dari js2coffee.org :

js2coffee.org

LongYC
sumber
Anda sedang memeriksa apakah kuncinya ada, jadi ini masuk akal. Jika Anda juga perlu memeriksa apakah array tersebut ada, coba someArray? ['Key']?
Joshua Davison
6

Saya hanya menggunakan:

if (myVariable)
    //do stuff

Karena undefined itu falsy, ia hanya akan melakukan sesuatu jika myVariable tidak undefined.

Anda hanya perlu menyadari bahwa ini akan 'melakukan sesuatu' untuk nilai yang 0, "" dan null

Magrangs
sumber
1
Saya lebih suka metode ini selama myVariabletidak diizinkan menjadi nilai palsu seperti nullatau 0.
Bryan Downing
3

Cara terbersih yang saya temukan untuk menetapkan variabel ke variabel tidak terdefinisi dan tidak-null adalah menggunakan unless:

unless ( myVar? )
    myVar = 'val'
pembodohan
sumber
6
myVar ?= 'val'
Ricket
2

Mengapa tidak menggunakan idiom OR saja?

myVar or 'val'

Jadi, hasilnya akan sama dengan myVar, kecuali tidak ditentukan dalam hal ini akan sama dengan 'val'.

l3x
sumber
3
Dengan idiom ini, setiap nilai yang salah akan mengembalikan 'val' alih-alih apa pun yang seharusnya - termasuk '', 0.0dan false. Yang, mungkin, tidak diinginkan.
toriningen