Saya agak bingung tentang JavaScript undefined
dan null
nilai - nilai.
Apa yang if (!testvar)
sebenarnya dilakukan? Apakah tes untuk undefined
dan null
atau hanya undefined
?
Setelah variabel didefinisikan, bisakah saya menghapusnya kembali undefined
(karena itu menghapus variabel)?
Bisakah saya lulus undefined
sebagai parameter? Misalnya:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Jawaban:
Jangan bingung
null
. Biasanya masuk akal dan berperilaku mirip dengan konsep bahasa scripting lain 'out-of-band' null ',' nil 'atau' None '.undefined
, di sisi lain, adalah kekhasan JavaScript yang aneh. Ini adalah objek tunggal yang mewakili nilai out-of-band, pada dasarnya kedua serupa-tetapi-berbedanull
. Itu muncul:Saat Anda memanggil fungsi dengan argumen lebih sedikit dari daftar argumen di daftar
function
pernyataan, argumen yang tidak dilimpahkan diatur keundefined
. Anda dapat menguji untuk itu dengan misalnya .:Dengan metode ini Anda tidak dapat membedakan antara
dosomething(1)
dandosomething(1, undefined)
;arg2
akan bernilai sama di keduanya. Jika Anda perlu memberi tahu perbedaannya, Anda dapat melihatnyaarguments.length
, tetapi melakukan argumen opsional seperti itu umumnya tidak terlalu mudah dibaca.Ketika suatu fungsi tidak
return value;
, itu kembaliundefined
. Biasanya tidak perlu menggunakan hasil pengembalian seperti itu.Saat Anda mendeklarasikan variabel dengan memiliki
var a
pernyataan di blok, tetapi belum menetapkan nilainya, itu adalahundefined
. Sekali lagi, Anda seharusnya tidak perlu bergantung pada itu.typeof
Operator seram kembali'undefined'
ketika operan adalah variabel sederhana yang tidak ada, alih-alih melempar kesalahan seperti biasa terjadi jika Anda mencoba merujuknya. (Anda juga bisa memberikan variabel sederhana yang dibungkus dengan tanda kurung, tetapi bukan ekspresi penuh yang melibatkan variabel yang tidak ada.) Tidak banyak gunanya juga.Ini yang kontroversial. Ketika Anda mengakses properti dari objek yang tidak ada, Anda tidak langsung mendapatkan kesalahan seperti dalam setiap bahasa lainnya. Sebaliknya Anda mendapatkan
undefined
objek. (Dan kemudian ketika Anda mencoba untuk menggunakanundefined
objek itu nanti dalam skrip itu akan salah dengan cara yang aneh yang jauh lebih sulit untuk dilacak daripada jika JavaScript baru saja melemparkan kesalahan langsung.)Ini sering digunakan untuk memeriksa keberadaan properti:
Namun, karena Anda dapat menetapkan
undefined
seperti nilai lainnya:itu tidak benar-benar mendeteksi apakah properti itu ada di sana dengan andal. Lebih baik menggunakan
in
operator, yang bukan dalam versi Netscape asli JavaScript, tetapi tersedia di mana-mana sekarang:Singkatnya,
undefined
adalah kekacauan khusus JavaScript, yang membingungkan semua orang. Terlepas dari argumen fungsi opsional, di mana JS tidak memiliki mekanisme lain yang lebih elegan,undefined
harus dihindari. Seharusnya tidak pernah menjadi bagian dari bahasa;null
akan bekerja dengan baik untuk (2) dan (3), dan (4) adalah kesalahan yang hanya ada karena pada awalnya JavaScript tidak memiliki pengecualian.Seperti pemeriksaan tes 'truthiness' melawan
false
,undefined
,null
,0
,NaN
dan string kosong. Tapi dalam kasus ini, ya, itu benarundefined
- benar diperhatikan. IMO, itu harus lebih eksplisit tentang itu dan katakanif (testvar!==undefined)
.Anda tentu dapat menetapkannya
undefined
, tetapi itu tidak akan menghapus variabel. Hanyadelete object.property
operator yang benar-benar menghapus barang.delete
benar-benar dimaksudkan untuk properti daripada variabel seperti itu. Peramban akan membiarkan Anda lolos dengan lurusdelete variable
, tetapi itu bukan ide yang baik dan tidak akan berfungsi dalam mode ketat ECMAScript Fifth Edition. Jika Anda ingin membebaskan referensi ke sesuatu sehingga dapat dikumpulkan dengan sampah, itu akan lebih biasa dikatakanvariable= null
.Iya.
sumber
undefined
adalah objek tunggal? Maksud kamu apa? Ini nilai primitif, dan bukan objek.typeof foo=='undefined'
; ini cenderung digunakan untuk (4a) mengendus global, dalam hal ini saya lebih suka untuk secara eksplisit dan mengatakan'foo' in window
, atau (4b) menguji terhadapundefined
-nilai itu sendiri, dalam hal ini saya lebih suka dibaca dan berkatafoo===undefined
. Secara teori pengujiantypeof
terhadap'undefined'
bisa menggunakan use case yang tidak bisa diberikan oleh konstruk lain: mengendus keberadaan variabel lokal. Namun pada kenyataannya Anda hampir selalu tahu variabel apa yang dinyatakan lokal.return
pernyataan kembaliundefined
, tetapi jika fungsinya adalah konstruktor (dipanggil dengannew
operator) itu akan mengembalikan objek baru (nilaithis
di dalam konstruktor) meskipun tidak memilikireturn
pernyataan.console.log((function (){}()));
kembaliundefined
.console.log((new function (){}()));
mengembalikan objek.Anda tidak dapat (tidak?) Mendefinisikan sesuatu sebagai tidak terdefinisi, karena variabel tidak lagi ditentukan - Anda baru saja mendefinisikan menjadi sesuatu.
Anda tidak dapat (tidak boleh?) Beralih
undefined
ke suatu fungsi. Jika Anda ingin memberikan nilai kosong, gunakannull
saja.Pernyataan itu
if(!testvar)
memeriksa nilai benar / salah boolean, yang satu ini menguji apakahtestvar
dievaluasi atau tidakfalse
. Menurut definisi,null
danundefined
tidak boleh dievaluasi bukan sebagaitrue
ataufalse
, tetapi JavaScript mengevaluasinull
sebagaifalse
, dan memberikan kesalahan jika Anda mencoba untuk mengevaluasi variabel yang tidak terdefinisi.Untuk benar menguji
undefined
ataunull
, gunakan ini:sumber
==
dan!=
).var a= undefined
. Anda bisa lulusfn(undefined)
. Jika Anda ingin menemukan perbedaan antara properti yang tidak terdefinisip
dari objeko
, dan propertip
yang telah ditentukan dan ditetapkanundefined
, Anda harus menggunakan'p' in o
operator.testvar === undefined
daripada yang lebih rumittypeof(testvar) === "undefined"
?typeof
tes untuk variabel yang tidak terdefinisi: tidak sepertinull
,undefined
hanyalah properti dari objek global dan dapat dengan sendirinya didefinisikan ulang. Hanya membutuhkan gaya pengkodean tertentu dan tanda sama dengan yang hilang danundefined
diam-diam diubah:if (undefined = someVar) {...}
undefined
properti yang tidak berubah dari objek global, jadi lebih aman daripada sebelumnya. Namun, masih mungkin untuk mendefinisikan variabel yang dapat diubah yang disebutundefined
dalam suatu fungsi, sehingga masalahnya belum sepenuhnya hilang.Perbedaan dasarnya adalah itu
undefined
dannull
mewakili konsep yang berbeda.Jika hanya
null
tersedia, Anda tidak akan dapat menentukan apakahnull
ditetapkan secara sengaja sebagai nilai atau apakah nilai belum ditetapkan, kecuali jika Anda menggunakan penangkapan kesalahan rumit: misalnyaNamun, jika Anda sengaja menetapkan nilainya
null
, kesetaraan ketat denganundefined
gagal, sehingga memungkinkan Anda untuk membedakannull
danundefined
nilainya:Lihatlah referensi di sini alih-alih mengandalkan orang-orang dengan acuh tak acuh mengatakan sampah seperti "Singkatnya, undefined adalah kekacauan spesifik JavaScript, yang membingungkan semua orang". Hanya karena Anda bingung, itu tidak berarti bahwa itu berantakan.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Perilaku ini juga tidak spesifik untuk JavaScript dan melengkapi konsep umum yang hasil boolean bisa
true
,false
, tidak diketahui (null
), tidak ada nilai (undefined
), atau sesuatu yang tidak beres (error
).http://en.wikipedia.org/wiki/Undefined_value
sumber
null
akan bekerja dengan baik.a == null
adalahtrue
karena jenis Javascript paksaan.Cara terbaik untuk memeriksa nilai null adalah
dan untuk yang tidak terdefinisi
Anda dapat menetapkan tersedia dengan undefined.
sumber
!==
, bukan!=
YA, Anda bisa, karena tidak terdefinisi didefinisikan sebagai tidak terdefinisi.
kasus Anda:
Anda juga dapat membuat variabel tidak terdefinisi sendiri:
sumber
Untuk menjawab pertanyaan pertama Anda, operator yang tidak (
!
) akan memaksa apa pun yang diberikan menjadi nilai boolean. Jadinull
,0
,false
,NaN
dan""
(string kosong) akan semua muncul palsu.sumber
undefined
tidak akan muncul sebagaifalse
, ia akan melempar kesalahan 'tidak didefinisikan'.if (undefined) {/* Do stuff*/}
tidak akan memberikan kesalahan, karenaundefined
ada sebagai properti dari objek global. Apa yang akan memberikan kesalahan adalah sesuatu sepertiif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, cara mengatur variabel menjadi tidak terdefinisi pada commandline:
Setel variabel menjadi tidak terdefinisi di
js
terminal baris perintah javascript yang disertakan dengan Java pada Ubuntu 12.10.Jika Anda mengatur variabel untuk tidak terdefinisi dalam javascript:
Letakkan ini di myjs.html:
Mencetak ini:
PERINGATAN! Saat mengatur variabel Anda ke undefined Anda mengatur variabel Anda ke variabel lain. Jika beberapa orang licik berjalan
undefined = 'rm -rf /';
maka setiap kali Anda mengatur variabel Anda ke tidak terdefinisi, Anda akan menerima nilai itu.Anda mungkin bertanya-tanya bagaimana saya bisa menampilkan nilai alien yang tidak ditentukan di awal dan membuatnya tetap berjalan. Itu karena pengangkatan javascript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
sumber
Coba ini:
sumber
Untuk
if (something)
danif (!something)
biasanya digunakan untuk memeriksa apakah ada sesuatu yang didefinisikan atau tidak. Sebagai contoh:Pengidentifikasi dikonversi ke nilai boolean, jadi
undefined
diartikan sebagaifalse
. Tentu saja ada nilai-nilai lain (seperti 0 dan '') yang juga ditafsirkan sebagaifalse
, tetapi salah satu pengidentifikasi tidak boleh memiliki nilai seperti itu atau Anda senang memperlakukan nilai seperti itu sama dengan yang tidak terdefinisi.Javascript memiliki
delete
operator yang dapat digunakan untuk menghapus anggota suatu objek. Bergantung pada ruang lingkup variabel (yaitu apakah itu global atau tidak) Anda dapat menghapusnya agar tidak terdefinisi.Tidak ada
undefined
kata kunci yang dapat Anda gunakan sebagai literal yang tidak terdefinisi. Anda bisa menghilangkan parameter dalam panggilan fungsi untuk membuatnya tidak terdefinisi, tetapi itu hanya bisa digunakan dengan mengirimkan lebih sedikit parameter ke fungsi, Anda tidak bisa menghilangkan parameter di tengah.sumber
Hanya untuk bersenang-senang, inilah cara yang cukup aman untuk menetapkan "tidak ditugaskan" ke suatu variabel. Agar tabrakan ini terjadi, seseorang harus menambahkan prototipe untuk Object dengan nama yang persis sama dengan string yang dihasilkan secara acak. Saya yakin generator string acak dapat ditingkatkan, tetapi saya hanya mengambil satu dari pertanyaan ini: Hasilkan string / karakter acak dalam JavaScript
Ini bekerja dengan membuat objek baru dan mencoba mengakses properti di atasnya dengan nama yang dihasilkan secara acak, yang kita asumsikan tidak akan ada dan karenanya akan memiliki nilai yang tidak terdefinisi.
sumber