Akan lebih bagus jika pertanyaan terakhir ditambahkan dalam judul. Jawaban di sini luar biasa, tetapi judulnya mungkin tidak menunjukkan bahwa Anda akan menemukan jawaban ini di sini
marcos.borunda
6
Null bukan objek dalam JavaScript! typeof null === 'object'tapi itu bug! Berikut tautan Tonton semua video dan nikmati :)
COR
1
Saya suka menggunakan C / C ++ sebagai kebenaran aksiomatik untuk apa variabel bernilai yang tidak terdefinisi dan NULL, karena sangat mudah. Kemudian lihat bagaimana definisi tersebut dibandingkan dengan spesifikasi bahasa lain.
samis
Jawaban:
1488
(name is undefined)
Anda: Apa itu name? (*) JavaScriptname :? Apa itu name? Saya tidak tahu apa yang Anda bicarakan. Anda belum pernah menyebutkan namesebelumnya. Apakah Anda melihat beberapa bahasa skrip lain di sisi (klien-)?
name =null;
Anda: Apa itu name? JavaScript: Saya tidak tahu.
Pendeknya; undefinedadalah di mana tidak ada gagasan tentang hal itu ada; tidak memiliki tipe, dan itu belum pernah dirujuk sebelumnya dalam lingkup itu; nulladalah tempat benda diketahui ada, tetapi tidak diketahui nilainya.
Satu hal yang perlu diingat adalah bahwa nulltidak, secara konseptual, sama dengan falseatau ""atau seperti itu, bahkan jika mereka menyamakan setelah pengecoran tipe, yaitu
name =false;
Anda: Apa itu name? JavaScript: Boolean salah.
name ='';
Anda: Apa itu name? JavaScript: String kosong
*: namedalam konteks ini dimaksudkan sebagai variabel yang belum pernah didefinisikan. Ini bisa berupa variabel yang tidak terdefinisi, namun, nama adalah properti dari hampir semua elemen bentuk HTML. Ini berjalan jauh, kembali dan dilembagakan jauh sebelum id. Ini berguna karena id harus unik tetapi nama tidak harus.
Namun dalam JavaScript, string kosong '' masih boolean false.
Andreas Grech
117
String kosong bukanlah boolean false, tetapi dalam konteks kondisional, string tersebut ditafsirkan sebagai nilai false (y) (paksaan).
Bryan Matthews
22
Untuk kasus kedua, di mana nama = null, alih-alih 'Saya tidak tahu', JavaScript dapat menjawab: Objek nol. Selain itu saya suka gaya jawabannya.
Jean Vincent
16
Daripada "Saya tidak tahu", saya akan mengatakan jawabannya nulladalah "tidak ada". Null secara tepat didefinisikan sebagai tidak ada nilai. Batal, nihil, nada. Tidak ada.
mikl
50
Suka gaya menjawab itu. Secara umum, "Anda belum pernah menyebutkan namesebelumnya" adalah benar. Namun, mendeklarasikan variabel tanpa memberikan nilai padanya ( var somevar;), secara mengejutkan masih cukup menghasilkan undefined.
MC Emperor
142
Perbedaannya dapat diringkas ke dalam cuplikan ini:
@kentaromiura Bagi kami Javascript noobs ... mungkin hanya saya ... apa sintaksis Boolean (nilai) ini? Casting ke Boolean?
xr280xr
@ xr280xr Ya, ini casting. Coba String(null)lihat contoh casting lainnya. Anda bahkan dapat melakukan hal-hal konyol seperti Number(null + 2)... tetapi Anda tidak boleh :-). Jawaban sempurna dari kentaromiura.
squidbe
Ingat typeofadalah operator. Anda tidak akan membungkus operan dalam tanda kurung untuk alasan yang sama Anda tidak akan menulis var sum = 1 +(1);.
alex
124
nulladalah bukan obyek , itu adalah nilai yang primitif . Misalnya, Anda tidak dapat menambahkan properti ke dalamnya. Terkadang orang salah menganggap bahwa itu adalah objek, karena typeof nullkembali "object". Tapi itu sebenarnya bug (yang mungkin diperbaiki di ECMAScript 6).
Perbedaan antara nulldan undefinedadalah sebagai berikut:
undefined: digunakan oleh JavaScript dan berarti "tidak ada nilai". Variabel tidak diinisialisasi, parameter yang hilang dan variabel yang tidak diketahui memiliki nilai itu.
Sebagai aturan umum, Anda harus selalu menggunakan === dan tidak pernah == dalam JavaScript (== melakukan semua jenis konversi yang dapat menghasilkan hasil yang tidak terduga). Pemeriksaan x == nullini merupakan kasus tepi, karena berfungsi untuk keduanya nulldan undefined:
>null==nulltrue>undefined==nulltrue
Cara yang umum untuk memeriksa apakah suatu variabel memiliki nilai adalah dengan mengubahnya menjadi boolean dan melihat apakah variabel itu bernilai true. Konversi itu dilakukan oleh ifpernyataan dan operator boolean! ("tidak").
function foo(param){if(param){// ...}}function foo(param){if(! param) param ="abc";}function foo(param){// || returns first operand that can't be converted to false
param = param ||"abc";}
Kelemahan dari pendekatan ini: Semua nilai berikut dievaluasi false, jadi Anda harus berhati-hati (mis. Cek di atas tidak dapat membedakan antara undefineddan 0).
undefined, null
Boolean: false
Nomor: +0, -0,NaN
String: ""
Anda dapat menguji konversi ke boolean dengan menggunakan Booleansebagai fungsi (biasanya itu adalah konstruktor, untuk digunakan bersama new):
Mengapa referensi +0dan secara -0terpisah jika +0 === -0?
Raynos
6
Mungkin karena Anda masih dapat membedakan +0dan -0: 1/+0 !== 1/-0.
neo
1
Jawaban ini menghubungkan ke pos yang menautkan kembali ke jawaban ini sebagai sumber ... mungkin dimaksudkan untuk menautkan ini sebagai gantinya 2ality.com/2013/10/typeof-null.html
Ricardo Tomasi
Oh benar, seperti di C, di mana deklarasi variabel yang tidak diinisialisasi dianggap tidak terdefinisi (versi lama sebenarnya bisa berisi data program sebelumnya).
samis
5
"Tapi itu sebenarnya bug (yang mungkin diperbaiki di ECMAScript 6)" - source?
Gajus
26
Apa perbedaan antara null dan undefined ??
Properti ketika tidak memiliki definisi, tidak ditentukan. null adalah sebuah objek. Jenisnya adalah objek. null adalah nilai khusus yang berarti "tidak ada nilai. undefined bukan objek, tipenya tidak terdefinisi.
Anda dapat mendeklarasikan variabel, setel ke nol, dan perilaku itu identik kecuali bahwa Anda akan melihat "null" dicetak versus "tidak terdefinisi". Anda bahkan dapat membandingkan variabel yang tidak ditentukan ke nol atau sebaliknya, dan kondisinya akan benar:
Anda harus menggunakan ===, lalu tidak terdefinisi! == null: D
olliej
1
memperhatikan bagian terakhir, tidak benar melihat jawaban saya;)
kentaromiura
6
! Objek tidak sama dengan "objek == null" ... Bahkan, mereka sangat berbeda. ! Objek akan mengembalikan true jika objek adalah 0, string kosong, Boolean false, undefined atau null.
James
3
Apakah null benar-benar objek? Tautan ke-1 yang Anda berikan memeriksa null berdasarkan typeof, tetapi typeof (null) mengevaluasi ke 'objek' karena kesalahan desain bahasa.
c4il
2
nullbukan obyek. Yang typeof null == 'object';mengembalikan true adalah karena bug yang tidak dapat diperbaiki di JavaScript (saat ini, tetapi mungkin berubah di masa depan).
Mohamad
21
Bagian pertama dari pertanyaan:
Mengapa null dianggap sebagai objek dalam JavaScript?
Ini adalah kesalahan desain JavaScript yang tidak dapat mereka perbaiki sekarang. Seharusnya tipe null, bukan tipe objek, atau tidak memilikinya sama sekali. Itu memerlukan pemeriksaan tambahan (kadang-kadang dilupakan) ketika mendeteksi objek nyata dan merupakan sumber bug.
Bagian kedua dari pertanyaan:
Memeriksa
if (object == null) Do something
sama dengan
if (!object) Do something
Kedua cek selalu salah, kecuali untuk:
objek tidak terdefinisi atau nol: keduanya benar.
objek primitif, dan 0 "",, atau false: centang pertama salah, kedua benar.
Jika objek tidak primitif, tapi Obyek nyata, seperti new Number(0), new String(""), atau new Boolean(false), maka kedua cek palsu.
Jadi jika 'objek' diartikan sebagai Obyek nyata maka kedua pemeriksaan selalu sama. Jika primitif diizinkan maka cek berbeda untuk 0 "",, dan salah.
Dalam kasus seperti object==null, hasil yang tidak jelas bisa menjadi sumber bug. Penggunaan ==tidak disarankan, gunakan ===saja.
Bagian ketiga dari pertanyaan:
Dan juga:
Apa perbedaan antara null dan undefined?
Dalam JavaScript, satu perbedaan adalah bahwa null adalah tipe objek dan undefined adalah tipe undefined.
Dalam JavaScript, null==undefinedbenar, dan dianggap sama jika jenisnya diabaikan. Mengapa mereka memutuskan itu, tetapi 0, ""dan salah tidak sama, saya tidak tahu. Tampaknya itu pendapat yang sewenang-wenang.
Dalam JavaScript, null===undefinedtidak benar karena jenisnya harus sama dalam ===.
Pada kenyataannya, nol dan tidak terdefinisi identik, karena keduanya mewakili ketidakberadaan. Begitu juga 0, dan ""dalam hal ini juga, dan mungkin wadah kosong []dan {}. Begitu banyak jenis yang sama tidak ada resep untuk bug. Satu jenis atau tidak sama sekali lebih baik. Saya akan mencoba menggunakan sesedikit mungkin.
'salah', 'benar', dan '!' adalah sekumpulan cacing lain yang dapat disederhanakan, misalnya, if(!x)dan if(x)sendirian saja sudah cukup, Anda tidak perlu benar dan salah.
Deklarasi var xadalah tipe yang tidak terdefinisi jika tidak ada nilai yang diberikan, tetapi harus sama seperti jika x tidak pernah dideklarasikan sama sekali. Sumber bug lain adalah wadah kosong apa pun. Jadi yang terbaik adalah mendeklarasikan dan mendefinisikannya bersama var x=1.
Orang-orang berputar-putar berusaha mencari tahu semua jenis yang berbeda ini, tetapi semuanya sama saja dengan pakaian yang berbeda dan rumit. Kenyataannya adalah
Jawaban yang bagus, tetapi terlalu jauh dengan []: " Pada kenyataannya, null dan undefined identik ... dan mungkin wadah kosong [] dan {}. " Anda mungkin bisa membuat saya berpikir bahwa {} harus berupa beberapa rasa nol, tetapi kesan saya adalah bahwa seharusnya tidak. Tetapi kurang kontroversial, array kosong []dimengerti memiliki .push()fungsi , jadi tidak ada argumen yang bagus untuk [] menjadi nol. $ 0,02.
ruffin
11
var x =null;
x didefinisikan sebagai null
y tidak didefinisikan; // karena saya tidak mendefinisikannya
Fungsionalitas baru yang dalam keadaan fluks. Berikut ini mengembalikan nol:
var proto =Object.getPrototypeOf(Object.getPrototypeOf({}));// But this returns undefined:Object.getOwnPropertyDescriptor({},"a");
Semua kasus ketidak-hadiran lainnya dilambangkan dengan tidak terdefinisi (sebagaimana dicatat oleh @Axel). Setiap cetakan berikut "tidak terdefinisi":
Tentu saja jika Anda memutuskan untuk menulis var unitialised = null; atau mengembalikan nol dari metode sendiri maka Anda memiliki nol terjadi dalam situasi lain. Tetapi itu harus cukup jelas.
Kasus ketiga adalah ketika Anda ingin mengakses variabel tetapi Anda bahkan tidak tahu apakah itu telah dinyatakan. Untuk itu gunakan typeof untuk menghindari kesalahan referensi:
if(typeof unknown !=="undefined"){//use unknown}
Dalam ringkasan cek untuk null ketika Anda memanipulasi DOM, berurusan dengan Ajax, atau menggunakan fitur ECMAScript 5 tertentu. Untuk semua kasus lain, aman untuk memeriksa tidak terdefinisi dengan kesetaraan yang ketat:
tidak "v my myDefined;" mendefinisikan variabel (sebagai variabel yang dikenal dengan tipe tidak dikenal)?
Qi Fan
6
null dan undefined keduanya false untuk persamaan nilai (null == undefined): keduanya runtuh menjadi boolean false. Mereka bukan objek yang sama (null! == tidak terdefinisi).
undefined adalah properti dari objek global ("window" di browser), tetapi merupakan tipe primitif dan bukan objek itu sendiri. Ini nilai default untuk variabel dan fungsi yang tidak diinisialisasi yang berakhir tanpa pernyataan pengembalian.
null adalah turunan dari Object. null digunakan untuk metode DOM yang mengembalikan objek koleksi untuk menunjukkan hasil kosong, yang memberikan nilai palsu tanpa menunjukkan kesalahan.
Anda mungkin mempertimbangkan undefineduntuk mewakili nullketidakhadiran nilai tingkat sistem, tidak terduga, atau seperti kesalahan dan untuk mewakili ketidakhadiran nilai tingkat program, normal, atau yang diharapkan. Jika Anda perlu menetapkan salah satu dari nilai-nilai ini ke variabel atau properti atau meneruskan salah satu dari nilai-nilai ini ke suatu fungsi, nullhampir selalu merupakan pilihan yang tepat.
Tidak, bukan. Object () melakukan kerja dengan cara itu, lihat ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - 15.2.2.1 Obyek baru ([nilai]) ... 8. (Nilai argumen tidak disertakan atau tipenya Null atau Undefined.) Buat objek ECMAScript asli baru. Properti [[Prototipe]] dari objek yang baru dibangun diatur ke objek prototipe Obyek. Properti [[Kelas]] objek yang baru dibangun diatur ke "Objek". Objek yang baru dibangun tidak memiliki properti [[Nilai]]. Kembalikan objek asli yang baru dibuat.
kentaromiura
3
@Christoph: Maksudku, kau benar. null harus berupa tipe, maksud saya adalah Anda tidak dapat memeriksanya dengan cara itu karena: alert (Object baru ()! == Object baru ()); / * true, istance baru bukan istance / alert yang sama (Object (null) .constructor == {} .constructor); / true seperti dalam spec / alert (Object (null) .prototype == {} .prototype); / true seperti pada spec / alert (null instanceof Object); / Jelas salah, null berarti tidak dipakai * / Tapi pada dasarnya adalah bug spesifikasi XD lihat: uselesspickles.com/blog/2006/06/12/… dan javascript.crockford.com/remedial.html
kentaromiura
2
Fungsi berikut menunjukkan mengapa dan mampu mengatasi perbedaan:
function test(){var myObj ={};
console.log(myObj.myProperty);
myObj.myProperty =null;
console.log(myObj.myProperty);}
Jika Anda menelepon
test();
Kamu mendapatkan
tidak terdefinisi
batal
Yang pertama console.log(...)mencoba untuk mendapatkan myPropertydari myObjsaat belum ditetapkan - sehingga ia akan kembali "tidak terdefinisi". Setelah menetapkan nol untuk itu, yang kedua console.log(...)jelas mengembalikan "null" karena myPropertyada, tetapi memiliki nilai yang nullditetapkan untuk itu.
Untuk dapat menanyakan perbedaan ini, JavaScript memiliki nulldan undefined: Sementara null- seperti dalam bahasa lain objek, undefinedtidak dapat menjadi objek karena tidak ada instance (bahkan bukan nullinstance) tersedia.
Bisakah Anda menguraikan perbedaan antara kedua kondisi
rahul
baca jawaban saya, maksudnya jika o sama dengan 0, false atau "" nilai Boolean salah: var undef, variety = [0, "", null, false, undef]; untuk (var obj dalam berbagai) {alert (! obj); // 4 kali salah di IE, 5 di FF;)}
kentaromiura
2
Hal menyenangkan lainnya tentang null, dibandingkan dengan tidak terdefinisi, adalah bahwa hal itu dapat ditingkatkan.
x =undefined
x++
y =null
y++
console.log(x)// NaN
console.log(y)// 0
Dalam Javascriptnull bukan objecttipe itu adalah primitavetipe.
Apa bedanya? Undefined mengacu pada pointer yang belum diatur.
Null mengacu pada pointer nol misalnya sesuatu telah secara manual mengatur variabel menjadi tipenull
Dari "Prinsip-prinsip Javascript Berorientasi Objek" oleh Nicholas C. Zakas
Tapi mengapa sebuah objek saat tipenya nol? (Faktanya, ini telah diakui sebagai kesalahan oleh TC39, komite yang mendesain dan mengelola JavaScript. Anda bisa beralasan bahwa null adalah penunjuk objek kosong, membuat "objek" nilai pengembalian logis, tetapi itu masih membingungkan.)
Zakas, Nicholas C. (2014-02-07). Prinsip JavaScript Berorientasi Objek (Lokasi Kindle 226-227). Tanpa Starch Press. Edisi menyalakan.
Yang mengatakan:
var game =null;//typeof(game) is "object"
game.score =100;//null is not an object, what the heck!?
game instanceofObject;//false, so it's not an instance but it's type is object//let's make this primitive variable an object;
game ={};typeof(game);//it is an object
game instanceofObject;//true, yay!!!
game.score =100;
Kasing tidak ditentukan:
var score;//at this point 'score' is undefinedtypeof(score);//'undefined'var score.player ="felix";//'undefined' is not an object
score instanceofObject;//false, oh I already knew that.
Cara terbaik untuk berpikir tentang 'nol' adalah dengan mengingat bagaimana konsep yang sama digunakan dalam database, di mana ini menunjukkan bahwa bidang berisi "tidak ada nilai sama sekali."
Ya, nilai item diketahui; itu adalah 'didefinisikan.' Ini telah diinisialisasi.
Nilai itemnya adalah: "tidak ada nilai."
Ini adalah teknik yang sangat berguna untuk menulis program yang lebih mudah didebug. Variabel 'tidak terdefinisi' mungkin merupakan hasil dari bug ... (bagaimana Anda tahu?) ... tetapi jika variabel tersebut berisi nilai 'null,' Anda tahu bahwa "seseorang, di suatu tempat dalam program ini, atur ke 'null.' "Oleh karena itu, saya sarankan bahwa, ketika Anda perlu menyingkirkan nilai variabel, jangan" hapus "... setel ke 'null.' Nilai lama akan menjadi yatim piatu dan akan segera dikumpulkan; nilai baru adalah, "tidak ada nilai (sekarang)." Dalam kedua kasus, keadaan variabel itu pasti: "jelas, sengaja, seperti itu."
Tidak terdefinisi berarti suatu variabel telah dideklarasikan tetapi belum diberi nilai apa pun sementara Null dapat ditetapkan ke variabel yang mewakili "tidak ada nilai". (Null adalah operator penugasan)
2.Defined adalah tipe itu sendiri sementara Null adalah objek.
3.Javascript itu sendiri dapat menginisialisasi variabel yang tidak ditetapkan untuk undefined tetapi tidak pernah dapat mengatur nilai variabel menjadi nol. Ini harus dilakukan secara terprogram.
typeof null === 'object'
tapi itu bug! Berikut tautan Tonton semua video dan nikmati :)Jawaban:
Anda: Apa itu
name
? (*)JavaScript
name
:? Apa ituname
? Saya tidak tahu apa yang Anda bicarakan. Anda belum pernah menyebutkanname
sebelumnya. Apakah Anda melihat beberapa bahasa skrip lain di sisi (klien-)?Anda: Apa itu
name
?JavaScript: Saya tidak tahu.
Pendeknya;
undefined
adalah di mana tidak ada gagasan tentang hal itu ada; tidak memiliki tipe, dan itu belum pernah dirujuk sebelumnya dalam lingkup itu;null
adalah tempat benda diketahui ada, tetapi tidak diketahui nilainya.Satu hal yang perlu diingat adalah bahwa
null
tidak, secara konseptual, sama denganfalse
atau""
atau seperti itu, bahkan jika mereka menyamakan setelah pengecoran tipe, yaituAnda: Apa itu
name
?JavaScript: Boolean salah.
Anda: Apa itu
name
?JavaScript: String kosong
*:
name
dalam konteks ini dimaksudkan sebagai variabel yang belum pernah didefinisikan. Ini bisa berupa variabel yang tidak terdefinisi, namun, nama adalah properti dari hampir semua elemen bentuk HTML. Ini berjalan jauh, kembali dan dilembagakan jauh sebelum id. Ini berguna karena id harus unik tetapi nama tidak harus.sumber
null
adalah "tidak ada". Null secara tepat didefinisikan sebagai tidak ada nilai. Batal, nihil, nada. Tidak ada.name
sebelumnya" adalah benar. Namun, mendeklarasikan variabel tanpa memberikan nilai padanya (var somevar;
), secara mengejutkan masih cukup menghasilkanundefined
.Perbedaannya dapat diringkas ke dalam cuplikan ini:
Memeriksa
object == null
berbeda untuk diperiksaif ( !object )
.Yang terakhir sama dengan
! Boolean(object)
, karena!
operator unary secara otomatis melemparkan operan yang tepat ke dalam Boolean.Karena
Boolean(null)
sama dengan yang salah maka!false === true
.Jadi, jika objek Anda bukan nol , tetapi salah atau 0 atau "" , centang akan lolos karena:
sumber
String(null)
lihat contoh casting lainnya. Anda bahkan dapat melakukan hal-hal konyol sepertiNumber(null + 2)
... tetapi Anda tidak boleh :-). Jawaban sempurna dari kentaromiura.typeof
adalah operator. Anda tidak akan membungkus operan dalam tanda kurung untuk alasan yang sama Anda tidak akan menulisvar sum = 1 +(1);
.null
adalah bukan obyek , itu adalah nilai yang primitif . Misalnya, Anda tidak dapat menambahkan properti ke dalamnya. Terkadang orang salah menganggap bahwa itu adalah objek, karenatypeof null
kembali"object"
. Tapi itu sebenarnya bug (yang mungkin diperbaiki di ECMAScript 6).Perbedaan antara
null
danundefined
adalah sebagai berikut:undefined
: digunakan oleh JavaScript dan berarti "tidak ada nilai". Variabel tidak diinisialisasi, parameter yang hilang dan variabel yang tidak diketahui memiliki nilai itu.Mengakses variabel yang tidak dikenal, menghasilkan pengecualian:
null
: digunakan oleh programmer untuk menunjukkan "tidak ada nilai", misalnya sebagai parameter untuk suatu fungsi.Memeriksa variabel:
Sebagai aturan umum, Anda harus selalu menggunakan === dan tidak pernah == dalam JavaScript (== melakukan semua jenis konversi yang dapat menghasilkan hasil yang tidak terduga). Pemeriksaan
x == null
ini merupakan kasus tepi, karena berfungsi untuk keduanyanull
danundefined
:Cara yang umum untuk memeriksa apakah suatu variabel memiliki nilai adalah dengan mengubahnya menjadi boolean dan melihat apakah variabel itu bernilai
true
. Konversi itu dilakukan olehif
pernyataan dan operator boolean! ("tidak").Kelemahan dari pendekatan ini: Semua nilai berikut dievaluasi
false
, jadi Anda harus berhati-hati (mis. Cek di atas tidak dapat membedakan antaraundefined
dan0
).undefined
,null
false
+0
,-0
,NaN
""
Anda dapat menguji konversi ke boolean dengan menggunakan
Boolean
sebagai fungsi (biasanya itu adalah konstruktor, untuk digunakan bersamanew
):sumber
+0
dan secara-0
terpisah jika+0 === -0
?+0
dan-0
:1/+0 !== 1/-0
.Properti ketika tidak memiliki definisi, tidak ditentukan. null adalah sebuah objek. Jenisnya adalah objek. null adalah nilai khusus yang berarti "tidak ada nilai. undefined bukan objek, tipenya tidak terdefinisi.
Anda dapat mendeklarasikan variabel, setel ke nol, dan perilaku itu identik kecuali bahwa Anda akan melihat "null" dicetak versus "tidak terdefinisi". Anda bahkan dapat membandingkan variabel yang tidak ditentukan ke nol atau sebaliknya, dan kondisinya akan benar:
Lihat Perbedaan JavaScript antara nol dan tidak terdefinisi untuk detail lebih lanjut.
dan dengan suntingan baru Anda ya
saat menguji apakah objek salah, keduanya hanya memenuhi kondisi saat menguji jika salah , tetapi tidak ketika benar
Periksa di sini: Gotcha Javascript
sumber
null
bukan obyek. Yangtypeof null == 'object';
mengembalikan true adalah karena bug yang tidak dapat diperbaiki di JavaScript (saat ini, tetapi mungkin berubah di masa depan).Bagian pertama dari pertanyaan:
Ini adalah kesalahan desain JavaScript yang tidak dapat mereka perbaiki sekarang. Seharusnya tipe null, bukan tipe objek, atau tidak memilikinya sama sekali. Itu memerlukan pemeriksaan tambahan (kadang-kadang dilupakan) ketika mendeteksi objek nyata dan merupakan sumber bug.
Bagian kedua dari pertanyaan:
Kedua cek selalu salah, kecuali untuk:
objek tidak terdefinisi atau nol: keduanya benar.
objek primitif, dan 0
""
,, atau false: centang pertama salah, kedua benar.Jika objek tidak primitif, tapi Obyek nyata, seperti
new Number(0)
,new String("")
, ataunew Boolean(false)
, maka kedua cek palsu.Jadi jika 'objek' diartikan sebagai Obyek nyata maka kedua pemeriksaan selalu sama. Jika primitif diizinkan maka cek berbeda untuk 0
""
,, dan salah.Dalam kasus seperti
object==null
, hasil yang tidak jelas bisa menjadi sumber bug. Penggunaan==
tidak disarankan, gunakan===
saja.Bagian ketiga dari pertanyaan:
Dalam JavaScript, satu perbedaan adalah bahwa null adalah tipe objek dan undefined adalah tipe undefined.
Dalam JavaScript,
null==undefined
benar, dan dianggap sama jika jenisnya diabaikan. Mengapa mereka memutuskan itu, tetapi 0,""
dan salah tidak sama, saya tidak tahu. Tampaknya itu pendapat yang sewenang-wenang.Dalam JavaScript,
null===undefined
tidak benar karena jenisnya harus sama dalam===
.Pada kenyataannya, nol dan tidak terdefinisi identik, karena keduanya mewakili ketidakberadaan. Begitu juga 0, dan
""
dalam hal ini juga, dan mungkin wadah kosong[]
dan{}
. Begitu banyak jenis yang sama tidak ada resep untuk bug. Satu jenis atau tidak sama sekali lebih baik. Saya akan mencoba menggunakan sesedikit mungkin.'salah', 'benar', dan '!' adalah sekumpulan cacing lain yang dapat disederhanakan, misalnya,
if(!x)
danif(x)
sendirian saja sudah cukup, Anda tidak perlu benar dan salah.Deklarasi
var x
adalah tipe yang tidak terdefinisi jika tidak ada nilai yang diberikan, tetapi harus sama seperti jika x tidak pernah dideklarasikan sama sekali. Sumber bug lain adalah wadah kosong apa pun. Jadi yang terbaik adalah mendeklarasikan dan mendefinisikannya bersamavar x=1
.Orang-orang berputar-putar berusaha mencari tahu semua jenis yang berbeda ini, tetapi semuanya sama saja dengan pakaian yang berbeda dan rumit. Kenyataannya adalah
Dan mungkin semua harus membuang pengecualian.
sumber
[]
dimengerti memiliki.push()
fungsi , jadi tidak ada argumen yang bagus untuk [] menjadi nol. $ 0,02.x didefinisikan sebagai null
y tidak didefinisikan; // karena saya tidak mendefinisikannya
null dievaluasi sebagai false
sumber
Salah satu cara untuk memahami nol dan tidak terdefinisi adalah dengan memahami di mana masing-masing terjadi.
Harapkan nilai pengembalian nol dalam situasi berikut:
Metode yang menanyakan DOM
Respons JSON diterima dari permintaan Ajax
RegEx.exec .
Fungsionalitas baru yang dalam keadaan fluks. Berikut ini mengembalikan nol:
Semua kasus ketidak-hadiran lainnya dilambangkan dengan tidak terdefinisi (sebagaimana dicatat oleh @Axel). Setiap cetakan berikut "tidak terdefinisi":
Tentu saja jika Anda memutuskan untuk menulis var unitialised = null; atau mengembalikan nol dari metode sendiri maka Anda memiliki nol terjadi dalam situasi lain. Tetapi itu harus cukup jelas.
Kasus ketiga adalah ketika Anda ingin mengakses variabel tetapi Anda bahkan tidak tahu apakah itu telah dinyatakan. Untuk itu gunakan typeof untuk menghindari kesalahan referensi:
Dalam ringkasan cek untuk null ketika Anda memanipulasi DOM, berurusan dengan Ajax, atau menggunakan fitur ECMAScript 5 tertentu. Untuk semua kasus lain, aman untuk memeriksa tidak terdefinisi dengan kesetaraan yang ketat:
sumber
Perbandingan berbagai pemeriksaan nol dalam JavaScript:
http://jsfiddle.net/aaronhoffman/DdRHB/5/
http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html
sumber
null dan undefined keduanya false untuk persamaan nilai (null == undefined): keduanya runtuh menjadi boolean false. Mereka bukan objek yang sama (null! == tidak terdefinisi).
undefined adalah properti dari objek global ("window" di browser), tetapi merupakan tipe primitif dan bukan objek itu sendiri. Ini nilai default untuk variabel dan fungsi yang tidak diinisialisasi yang berakhir tanpa pernyataan pengembalian.
null adalah turunan dari Object. null digunakan untuk metode DOM yang mengembalikan objek koleksi untuk menunjukkan hasil kosong, yang memberikan nilai palsu tanpa menunjukkan kesalahan.
sumber
Beberapa ketentuan:
null dan undefined adalah dua nilai yang berbeda. Satu mewakili tidak adanya nilai untuk nama dan yang lainnya mewakili tidak adanya nama.
Apa yang terjadi dalam suatu
if
berjalan sebagai berikut untukif( o )
:Ekspresi dalam tanda kurung dievaluasi, dan kemudian
if
tendangan dalam tipe-paksaan nilai ekspresi dalam tanda kurung - dalam kasus kamio
.Nilai Falsy (yang akan dipaksa menjadi salah) dalam JavaScript adalah: '', null, undefined, 0, dan false .
sumber
Untuk menambah jawaban Apa perbedaan antara
undefined
dannull
, dari JavaScript Definitive Guide 6th Edition, hal.41 di halaman ini :sumber
null
adalah sebuah objek. Jenisnya adalah nol.undefined
bukan obyek; jenisnya tidak terdefinisi.sumber
null
danundefined
merupakan nilai-nilai primitif -typeof null === 'object'
adalah bug bahasa, karenaObject(null) !== null
Fungsi berikut menunjukkan mengapa dan mampu mengatasi perbedaan:
Jika Anda menelepon
Kamu mendapatkan
Yang pertama
console.log(...)
mencoba untuk mendapatkanmyProperty
darimyObj
saat belum ditetapkan - sehingga ia akan kembali "tidak terdefinisi". Setelah menetapkan nol untuk itu, yang keduaconsole.log(...)
jelas mengembalikan "null" karenamyProperty
ada, tetapi memiliki nilai yangnull
ditetapkan untuk itu.Untuk dapat menanyakan perbedaan ini, JavaScript memiliki
null
danundefined
: Sementaranull
- seperti dalam bahasa lain objek,undefined
tidak dapat menjadi objek karena tidak ada instance (bahkan bukannull
instance) tersedia.sumber
Misalnya
window.someWeirdProperty
tidak terdefinisi, jadi"window.someWeirdProperty === null"
mengevaluasi ke false saat"window.someWeirdProperty === undefined"
mengevaluasi ke true.Checkif apalagi
if (!o)
tidak sama seperti memeriksaif (o == null)
untuko
menjadifalse
.sumber
Hal menyenangkan lainnya tentang null, dibandingkan dengan tidak terdefinisi, adalah bahwa hal itu dapat ditingkatkan.
Ini berguna untuk mengatur nilai numerik default untuk penghitung. Berapa kali Anda menetapkan variabel ke -1 dalam deklarasi?
sumber
Dalam Javascript
null
bukanobject
tipe itu adalahprimitave
tipe.Apa bedanya? Undefined mengacu pada pointer yang belum diatur. Null mengacu pada pointer nol misalnya sesuatu telah secara manual mengatur variabel menjadi tipe
null
sumber
Lihat ini:
sumber
Dari "Prinsip-prinsip Javascript Berorientasi Objek" oleh Nicholas C. Zakas
Zakas, Nicholas C. (2014-02-07). Prinsip JavaScript Berorientasi Objek (Lokasi Kindle 226-227). Tanpa Starch Press. Edisi menyalakan.
Yang mengatakan:
Kasing tidak ditentukan:
sumber
Cara terbaik untuk berpikir tentang 'nol' adalah dengan mengingat bagaimana konsep yang sama digunakan dalam database, di mana ini menunjukkan bahwa bidang berisi "tidak ada nilai sama sekali."
Ini adalah teknik yang sangat berguna untuk menulis program yang lebih mudah didebug. Variabel 'tidak terdefinisi' mungkin merupakan hasil dari bug ... (bagaimana Anda tahu?) ... tetapi jika variabel tersebut berisi nilai 'null,' Anda tahu bahwa "seseorang, di suatu tempat dalam program ini, atur ke 'null.' "Oleh karena itu, saya sarankan bahwa, ketika Anda perlu menyingkirkan nilai variabel, jangan" hapus "... setel ke 'null.' Nilai lama akan menjadi yatim piatu dan akan segera dikumpulkan; nilai baru adalah, "tidak ada nilai (sekarang)." Dalam kedua kasus, keadaan variabel itu pasti: "jelas, sengaja, seperti itu."
sumber
2.Defined adalah tipe itu sendiri sementara Null adalah objek.
3.Javascript itu sendiri dapat menginisialisasi variabel yang tidak ditetapkan untuk undefined tetapi tidak pernah dapat mengatur nilai variabel menjadi nol. Ini harus dilakukan secara terprogram.
sumber