Saya memiliki fungsi yang telah saya tulis yang pada dasarnya terlihat seperti ini:
function getNextCard(searchTerms) {
// Setup Some Variables
// Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
// ...
// If we find a next card to give, than give it
if (nextCardFound)
return nextCardFound;
// Otherwise - I'm returning undefined
return undefined;
}
Pertanyaan: Apakah lebih baik mengembalikan "null" di sini?
Saya dapat mengembalikan apa pun yang saya inginkan - tentu saja ... Saya hanya tidak yakin apa yang terbaik untuk digunakan.
Kode yang memanggil fungsi ini tahu bagaimana menangani undefined (sebenarnya tidak akan pernah benar-benar terjadi kecuali ada yang tidak beres)
Alasan saya menanyakan pertanyaan ini adalah karena saya mendengar sesuatu yang terdengar seperti "Jangan tetapkan tidak terdefinisi ke variabel" atau sesuatu - yang akan mempersulit proses debug. Jadi, fakta bahwa saya dapat melihat yang null
dikirimkan kembali memberi tahu saya bahwa pengembaliannya berfungsi - tetapi pada dasarnya berfungsi mirip dengan undefined
.
Dokumentasi:
Mozilla Docs Tidak menjawab pertanyaan saya ... google juga tidak: \
Pertanyaan SO ini - terlalu luas untuk apa yang saya coba cari tahu di sini.
null
. Tinggalkanundefined
JavaScript itu sendiri. Namun, tidak ada yang "lebih baik" jadi ini masalah opini.null
sebagai "tidak ada nilai yang sesuai untuk apa yang Anda minta" danundefined
sebagai "Saya tidak dapat menjawab apa yang Anda minta".Jawaban:
Saya berpendapat tidak ada cara terbaik, dan bahkan fungsi standar terkadang memilih satu atau yang lain.
Sebagai contoh:
[[Prototipe]]
Objek biasa memiliki slot internal [[Prototipe]], yang menentukan dari objek lain mana mereka mewarisi. Tentu saja, harus ada cara untuk mengatakan bahwa suatu objek tidak mewarisi dari yang lain. Dalam kasus ini, "tidak ada objek seperti itu" diwakili menggunakan
null
.Object.getOwnPropertyDescriptor
Diharapkan untuk mengembalikan deskriptor properti, yaitu objek yang mendeskripsikan properti (misalnya nilai, kemampuan menulis, enumerabilitas, dan konfigurasi). Namun, properti tersebut mungkin tidak ada. Dalam kasus ini, "tidak ada properti seperti itu" diwakili menggunakan
undefined
.document.getElementById
Diharapkan untuk mengembalikan elemen dengan ID yang diberikan. Namun, mungkin tidak ada elemen dengan ID tersebut. Dalam kasus ini, "tidak ada elemen seperti itu" diwakili menggunakan
null
.Jadi pilih saja apa pun yang Anda suka atau anggap lebih masuk akal untuk kasus spesifik Anda.
sumber
void 0
teknik ini untuk pemirsa selanjutnya dari jawaban ini. Saya juga menambahkan beberapa kode untuk mencoba dan membuat maksud Anda lebih jelas. Terima kasih atas jawaban Anda!Undefined biasanya mengacu pada sesuatu yang belum diberi nilai (yet). Null mengacu pada sesuatu yang secara definitif tidak memiliki nilai. Dalam hal ini, saya akan merekomendasikan mengembalikan null. Perhatikan bahwa fungsi tanpa nilai kembalian yang ditentukan secara implisit mengembalikan tidak terdefinisi.
Dari spesifikasi ECMAScript2015
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Bacaan lebih lanjut:
Kapan null atau undefined digunakan dalam JavaScript?
sumber
var x=someFunc();
, saya dengan sengaja menetapkan nilai xa, dan lebih suka tidak lulus tes apa pun yang menunjukkan itu belum (atau mungkin belum) diberi nilai. Just imhonull
) selama Anda tetap menggunakan satu, tetapi memiliki 2 nilai untuk menunjukkan tidak adanya nilai (apa pun "tipe") selalu membingungkanSaya akan memberi Anda cara pribadi saya untuk memilih di antara keduanya.
Pertanyaan sederhana saya adalah: dapatkah nilai, dengan masukan / status / konteks lain didefinisikan sebagai sesuatu?
Jika jawabannya iya maka gunakan
null
else useundefined
. Secara lebih umum, fungsi apa pun yang mengembalikan objek harus dikembalikannull
ketika objek yang dimaksud tidak ada. Karena itu bisa ada diberi masukan / keadaan / konteks lain.null
mewakili ketiadaan nilai untuk input / status / konteks tertentu. Ini secara implisit berarti bahwa konsep nilai itu sendiri ada dalam konteks aplikasi Anda, tetapi mungkin tidak ada. Dalam contoh Anda, konsep kartu berikutnya ada, tetapi kartu itu sendiri mungkin tidak ada.null
seharusnya digunakan.undefined
secara implisit merepresentasikan ketiadaan makna dari nilai tersebut dalam konteks aplikasi Anda. Misalnya, jika saya memanipulasiuser
objek dengan sekumpulan properti tertentu dan saya mencoba mengakses propertipikatchu
. Nilai properti ini harus disetel keundefined
karena dalam konteks saya, tidak masuk akal untuk memiliki properti seperti itu.sumber
null
, sedangkan fungsi dengan efek samping harus kembaliundefined
, ketika berpikir seperti programmer fungsional.undefined
bukanlah sesuatu yang harus Anda tetapkan. Anda mungkin ingin mempertimbangkan untuk mengembalikan sesuatu selainundefined
. Dalam kasus Anda, bahkan jika Anda tidak mengembalikan apa pun, hasilnya akanundefined
sudah ada. Jadi, saya sarankan untuk perginull
saja.Pertimbangkan contoh ini,
function getSomething() { // .. do something return undefined; } function doSomething() { // .. I'm not gonna return anything. } var a = getSomething(); var b = doSomething();
Hasil sampel di atas
a === b
, yaituundefined
. Perbedaannya adalah Anda menyimpan 1 eksekusi pernyataan.sumber
undefined
tidak harus ditugaskan. Semua variabel yang dideklarasikan tanpa nilai sudahundefined
.(function(){ /* code */ })()
mengembalikan null di konsol.undefined
pada konsol chrome dan firefox saya.undefined
jika sesuatu yang lain tidak kembali lebih awal - saya tidak perlu melakukannya karena perilaku default fungsi jika Anda tidak mengembalikan apa pun berarti mengembalikan tidak ditentukan - mereka hanya mengatakan bahwa ini tidak diperlukan. Selanjutnya ... Saya suka apa yang Anda katakan tentang fungsi getter built-in yang mengembalikan null. Silakan posting jawaban Anda untuk efek itu dan saya akan menerimanya.Tergantung pada apa yang perlu Anda lakukan dengan nilai yang dikembalikan.
typeof null mengembalikan sebuah objek. objek tersebut memiliki nilai tidak terdefinisi
typeof undefined return undefined
sumber
typeof
tidak selalu mengembalikan tipe data sebenarnya dari suatu nilai, ia memiliki peta yang memetakan tipe data ke label dan mengembalikan label yang sesuai.typeof
, meskipun namanya tidak memberi tahu jenis nilai.Berikut adalah contoh di mana
undefined
lebih masuk akal daripadanull
:Saya menggunakan fungsi pembungkus untuk
JSON.parse
itu mengubah pengecualiannya menjadiundefined
:// parses s as JSON if possible and returns undefined otherwise // return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504 function JSON_parse_or_undefined(s) { if ("string" !== typeof s) return undefined try { const p = JSON.parse(s) return p } catch (x){} return undefined }
Perhatikan bahwa
null
ini valid di JSON sedangkanundefined
tidak.sumber
let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };
. Sekarang, saya yakin dua pengembalian dapat ditangani secara berbeda, dan mungkin tidak memenangkan kompetisi golf JS. Berhasil.Jawaban pertama benar. Mereka memiliki arti yang berbeda secara teoritis. Namun tidak selalu jelas mana yang harus diambil.
Saya cenderung menggunakan nol dalam perkembangan saya meskipun saya pikir itu sepenuhnya subjektif.
Saya menggunakannya terutama karena:
variabel tidak terdefinisi mungkin ditimpa di browser lama jadi mengembalikannya sedikit lebih rumit. Masalah yang sama ini memaksa Anda untuk menggunakan
typeof var === 'undefined'
saat mendapatkan hasil fungsi. tautanBahasa lain cenderung menggunakan null secara luas, banyak di antaranya bahkan tidak memiliki definisi (php misalnya). Itu memberi saya konsistensi saat beralih antar bahasa dengan cepat.
sumber
Saya pikir sangat diperdebatkan apa yang harus digunakan. Saya lebih suka kode yang semantik seakurat mungkin, jadi menurut saya
undefined
sesuai dalam kasus ini.Saya memikirkan
null
tugas sebagai arti "variabel yang tidak ada artinya". Ini berlawanan denganundefined
arti "hal ini tidak ada sama sekali"Seperti yang ditunjukkan oleh jawaban sebelumnya, kembali
undefined
memiliki masalah, dan sepenuhnya terserah Anda apakah itu mengganggu Anda. Itu tidak akan mengganggu saya.sumber
document.getElementById('iDoNotExist')
kembalinull
, meskipun artinya lebih dekat dengan "hal ini tidak ada sama sekali". Jika metode standar melakukannya, mengapa tidak OP?Saya berpendapat bahwa dalam kasus ini,
null
harus dikembalikan.Jika Anda mempertimbangkan pertanyaan dari sudut pandang ilmu komputer teoretis maka undefined digunakan untuk menunjukkan non-termination / non-computability (yaitu placeholder untuk titik tak terdefinisi
x
dari fungsi parsialf
yang sering ditulisf(x) = ⊥
).getNextCard
namun tampaknya dapat menghitung kartu berikutnya (jika ada) dan juga dapat menghitung jika tidak ada kartu berikutnya. Dengan kata lain, fungsinya total karena berhenti untuk setiap masukan.Karena itu, penghentian pensinyalan nilai khusus tanpa hasil yang berarti (yaitu "tidak ada kartu yang dapat saya kembalikan untuk masukan ini") diperlukan dan ini untuk saya
null
tidakundefined
.CATATAN:
Anda dapat melihat beberapa dukungan untuk argumen ini dalam beberapa bahasa yang diketik lainnya juga di mana penghentian tanpa hasil yang berarti diekspresikan menggunakan tipe opsi (terkadang juga disebut sebagai tipe nullable ). Contohnya adalah Maybe in Haskell .
Di sisi lain, kita tentu tidak tahu apa
undefined
JavaScript. Jadi, analogi undefined agak renggang. Selain itu, karena kita selalu ingin bekerja dengan fungsi total, ini berarti mengatakan "tidak pernah kembaliundefined
dari suatu fungsi". Yang tampaknya agak ketat, karena akan membatasi penggunaanundefined
properti / variabel yang belum disetel.Pada akhirnya, preferensi pribadi saya adalah tidak pernah kembali ke
undefined
tempat saya dapat kembalinull
dan saya juga berpendapat bahwa ini adalah konvensi pengkodean yang lebih baik (karena antara lainx !== null
lebih pendek daritypeof x !== 'undefined'
).sumber
Pendapat pribadi saya menurut pengalaman saya adalah jangan gunakan undefined dan null jika Anda tidak ingin merusak kode Anda. Setidaknya saya akan menghindarinya secara pribadi. Ada banyak fungsi di Javascript yang kembali tidak terdefinisi dan ok kita harus menggunakannya. Tetapi ketika Anda mendesain kode Anda, jangan menggunakannya. Penting untuk selalu mengembalikan sesuatu
"false"
setidaknya. Jika Anda memiliki sebuah array misalnya dan Anda memetakannya. Tidak baik untuk kembali[undefined, undefined.....]
atau hanyaundefined
. Lebih baik jika Anda tetap menggunakan tipe array asli. Contoh:const mapper:Map <string[],boolean[]> ['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false] or ['', dont, '', '', use] or al the stuff above and then filter(v => v) that will keep all undefined and null out
Itu idenya. Saya mencoba sepanjang waktu untuk menghindarinya. Karena
null
atauundefined
dapat dengan mudah merusak kode Andasumber