Bagaimana Anda memeriksa apakah suatu nilai adalah Obyek dalam JavaScript?
javascript
object
types
javascript-objects
Danny Fox
sumber
sumber
null
objek).Jawaban:
PEMBARUAN :
Jawaban ini tidak lengkap dan memberikan hasil yang menyesatkan . Misalnya,
null
juga dianggap tipeobject
dalam JavaScript, belum lagi beberapa kasus tepi lainnya. Ikuti rekomendasi di bawah ini dan lanjutkan ke "jawaban yang paling banyak dipilih (dan benar!)" Lainnya .Jawaban asli :
Coba gunakan
typeof(var)
dan / atauvar instanceof something
.EDIT: Jawaban ini memberikan ide bagaimana memeriksa properti variabel, tetapi itu bukan resep antipeluru (setelah semua tidak ada resep sama sekali!) Untuk memeriksa apakah itu objek, jauh dari itu. Karena orang cenderung mencari sesuatu untuk disalin dari sini tanpa melakukan riset, saya sangat merekomendasikan mereka beralih ke yang lain, jawaban yang paling tervotifikasi (dan benar!).
sumber
typeof
adalah operator, jadi tidak perlu()
.typeof
mengembalikan 'objek' untuk null, yang bukan objek, daninstanceof
tidak berfungsi untuk objek yang dibuat menggunakanObject.create(null)
.Jika
typeof yourVariable === 'object'
, itu objek atau null. Jika Anda ingin mengecualikan nol, buat sajatypeof yourVariable === 'object' && yourVariable !== null
.sumber
yourVariable !== null
praktik yang lebih baik?typeof null == 'object'
tidak akan diperbaiki di ES6 . Mereka berkata:This proposal has been rejected. It was implemented in V8 but it turned out that it broke a lot of existing sites. In the spirit of One JavaScript this is not feasible.
typeof
karena memiliki beberapa kasus khusus yang belum tentu masuk akal. Jika Anda mencoba membedakan antara array dan objek yang bukan array, maka Anda tentu tidak ingin menggunakannyatypeof
.Object.prototype.toString.call(yourVar)
, menjadi milik Anda apa yang perlu Anda periksa. Dalam hal array,Object.prototype.toString.call([1,2])
pengembalian[object Array]
Mari kita mendefinisikan "objek" dalam Javascript . Menurut dokumen MDN , setiap nilai adalah objek atau primitif:
Apa itu primitif?
3
'abc'
true
null
undefined
Apa itu objek (yaitu bukan primitif)?
Object.prototype
Object.prototype
Function.prototype
Object
Function
function C(){}
- fungsi yang ditentukan penggunaC.prototype
- properti prototipe dari fungsi yang ditentukan pengguna: ini bukanC
prototipenew C()
- "baru" -menggunakan fungsi yang ditentukan penggunaMath
Array.prototype
{"a": 1, "b": 2}
- objek yang dibuat menggunakan notasi literalnew Number(3)
- pembungkus di sekitar primitifObject.create(null)
Object.create(null)
Cara memeriksa apakah suatu nilai adalah objek
instanceof
dengan sendirinya tidak akan berfungsi, karena merindukan dua kasus:typeof x === 'object'
tidak akan berfungsi, karena false positive (null
) dan false negative (functions):Object.prototype.toString.call
tidak akan berfungsi, karena positif palsu untuk semua primitif:Jadi saya menggunakan:
@ Jawaban Daan juga sepertinya berhasil:
karena, menurut dokumen MDN :
Cara ketiga yang tampaknya berhasil (tidak yakin apakah itu 100%) adalah menggunakan
Object.getPrototypeOf
yang melempar pengecualian jika argumennya bukan objek:sumber
obj === Object(obj)
kembalitrue
untuk array.var x = []; console.log(x === Object(x)); // return true
getPrototypeOf
tidak berfungsi misalnya dengan proksi yang dicabut, yang merupakan objek tetapi melempar.({}).toString.apply(obj) === '[object Object]'
ini membedakan antara array dan objek yang bukan arrayunderscore.js menyediakan metode berikut untuk mengetahui apakah sesuatu benar-benar objek:
MEMPERBARUI
Karena bug sebelumnya di V8 dan optimasi kecepatan mikro kecil, metode ini terlihat sebagai berikut sejak underscore.js 1.7.0 (Agustus 2014):
sumber
return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
null
juga. Seharusnya jawaban yang diterima.Object.prototype.toString.call(myVar)
akan kembali:"[object Object]"
jika myVar adalah objek"[object Array]"
jika myVar adalah sebuah arrayUntuk informasi lebih lanjut tentang ini dan mengapa ini merupakan alternatif yang baik untuk mengetik, lihat artikel ini .
sumber
typeof [] === 'object'
->true
. Itulah yang Anda butuhkan dari metode ini.Object.prototype.toString.call(3)
->"[object Number]"
.Object.prototype.toString.call(new Number(3))
->"[object Number]
"getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
Untuk hanya memeriksa terhadap Object atau Array tanpa panggilan fungsi tambahan (kecepatan). Seperti juga diposting di sini .
isArray ()
isObject () - Catatan: gunakan hanya untuk Objek literal, karena mengembalikan false untuk objek kustom, seperti Date baru atau YourCustomObject baru.
sumber
isObject
hanya bekerja dengan objek literal. Jika saya membuat tipe khusus, buat instance dari tipe dan mengujinya, ia kembalifalse
Boolean(a)
lebih panjang, tetapi jauh lebih intuitif. Hanya saja, jangan gunakannew Boolean(a)
: ( inilah sebabnya )!{
karakter. Untuk kasus array, selama Anda tidak perlu mendukung IE <9, Anda dapat menggunakanArray.isArray()
untuk menentukan apakah sesuatu array. Itu melewati semua kasus uji yang Anda berikan.Saya sangat suka:
Jika item tersebut adalah objek JS, dan itu bukan array JS, dan itu bukan
null
... jika ketiganya terbukti benar, kembalitrue
. Jika salah satu dari tiga kondisi gagal,&&
tes akan mengalami hubungan pendek danfalse
akan dikembalikan. Thenull
pengujian dapat dihilangkan jika diinginkan (tergantung pada bagaimana Anda menggunakannull
).DOCS:
http://devdocs.io/javascript/operators/typeof
http://devdocs.io/javascript/global_objects/object
http://devdocs.io/javascript/global_objects/array/isarray
http://devdocs.io/javascript/global_objects/null
sumber
new Date()
mengembalikan objek. Array adalah dari sudut pandang logis bukan objek - meskipun JavaScript menangani dan melaporkannya seperti itu. Namun dalam praktiknya, tidak membantu melihat mereka sama, karena mereka tidak sama. Objek tidak memilikilength
atribut misalnya dan tidak memiliki metode seperti push (). Dan kadang-kadang Anda mungkin ingin memberikan fungsi params kelebihan beban, di mana Anda perlu membuat perbedaan antara array atau objek terutama jika parameter lain bergantung pada yang diberikan.length
properti atau metode sepertipush
,Object.create(Array.prototype)
adalah contoh tandingan sepele objek non-array yang memiliki ini. Apa yang membuat array spesial adalah bahwa mereka adalah objek eksotis dengan metode internal esensial [[DefineOwnProperty]] khusus, tetapi mereka masih objek.length
properti (maksud saya objek literal tidak memilikilength
atribut secara default). Saya menulis bahwa array bukanlah objek dari sudut pandang logis . Saya berbicara tentang logika program. Kadang-kadang perlu untuk memeriksa apakah array adalah array "nyata" dan jelas bukan objek "nyata". Itu untuk apaArray.isArray()
. Bayangkan Anda memiliki fungsi yang menerima objek atau array objek. Memeriksa atribut atau metode khusus adalah solusi kotor. Cara asli selalu lebih baik.typeof null
adalah"object"
, tidak"undefined"
.Dengan fungsi
Array.isArray
:Tanpa fungsi
Array.isArray
:Hanya terkejut berapa banyak upvotes untuk jawaban yang salah 😮
Hanya 1 jawaban yang lulus ujian saya !!! Di sini saya telah membuat versi saya yang disederhanakan:
Bagi saya, itu jelas dan sederhana, dan hanya berfungsi! Di sini tes saya:
SATU LEBIH WAKTU: tidak semua jawaban lulus tes ini !!! 🙈
Jika Anda perlu memverifikasi bahwa objek adalah turunan dari kelas tertentu Anda harus memeriksa konstruktor dengan kelas khusus Anda, seperti:
tes sederhana:
Sebagai hasilnya, Anda akan memiliki kode yang ketat dan kuat!
Dalam kasus Anda tidak akan membuat fungsi seperti
isDate
,isError
,isRegExp
, dll Anda dapat mempertimbangkan pilihan untuk menggunakan fungsi umum ini:itu tidak akan bekerja dengan benar untuk semua kasus uji yang disebutkan sebelumnya, tetapi itu cukup baik untuk semua objek (polos atau dibangun).
isObject
tidak akan berfungsi jikaObject.create(null)
implementasi internalObject.create
dijelaskan di sini tetapi Anda dapat menggunakannyaisObject
dalam implementasi yang lebih canggih:Sudah ada paket yang dibuat di npm v1 berdasarkan implementasi ini! Dan itu bekerja untuk semua test case yang dijelaskan sebelumnya! 🙂
sumber
isDate
untukDateObject Anda dengan tujuan untuk menulis kode yang kuat jika tidak, Anda akan memilikiisObject
metode rapuh .Date
dalam komentar saya tidak dipilih karena ya, jawabannya tidak membahasDate
. TetapiDate
hanya salah satu dari kelas yang mungkin tak terbatas dan intinya berlaku untuk kelas lain. Contoh:class Foo() { }; var x = new Foo(); isObject(x)
kembalifalse
. Saya tidak tahu persis apa use case OP itu, tetapi mudah untuk memahami skenario di mana harus tahu tentang semua kelas yang mungkin dan memeriksa secara khusus terhadap masing-masing dari mereka akan menjadi tidak mungkin.Ya Tuhan! Saya pikir ini bisa lebih pendek dari sebelumnya, mari kita lihat ini:
Kode pendek dan final
Dijelaskan
Jenis pengembalian
typeof objek JavaScript (termasuk
null
) kembali"object"
Memeriksa konstruktor mereka
Memeriksa
constructor
fungsi pengembalian properti mereka dengan nama mereka.Memperkenalkan Function.name
Function.name
mengembalikan nama hanya baca dari fungsi atau"anonymous"
untuk penutupan.sumber
Object.create(null)
dan mengapa Anda tetap melakukan itu ...?OK, mari kita beri konsep ini dulu sebelum menjawab pertanyaan Anda, di JavaScript Fungsi adalah Object, juga null, Object, Array dan bahkan Date, jadi seperti yang Anda lihat tidak ada cara sederhana seperti typeof obj === 'object', jadi semua yang disebutkan di atas akan mengembalikan true , tetapi ada cara untuk memeriksanya dengan menulis fungsi atau menggunakan kerangka kerja JavaScript, OK:
Sekarang, bayangkan Anda memiliki objek ini yang merupakan objek nyata (bukan null atau fungsi atau array):
JavaScript Murni:
atau
atau
atau
Anda cukup menggunakan salah satu fungsi ini seperti di atas dalam kode Anda dengan memanggil mereka dan itu akan mengembalikan true jika itu adalah objek:
Jika Anda menggunakan kerangka kerja JavaScript, mereka biasanya telah menyiapkan fungsi semacam ini untuk Anda, ini adalah beberapa di antaranya:
jQuery:
Sudut:
Garis Bawah dan Lodash:
sumber
Itu tergantung pada apa yang Anda maksud dengan "adalah sebuah objek". Jika Anda ingin semua yang bukan primitif , yaitu hal-hal yang dapat Anda atur properti baru, ini harus melakukan trik:
Ini mengecualikan primitif (angka polos /
NaN
/Infinity
, string polos, simbol,true
/false
,undefined
dannull
) tetapi harus mengembalikan true untuk yang lainnya (termasukNumber
,Boolean
danString
objek). Perhatikan bahwa JS tidak mendefinisikan objek "host" apa, sepertiwindow
atauconsole
, yang harus dikembalikan saat digunakantypeof
, sehingga sulit untuk ditutup dengan tanda centang seperti ini.Jika Anda ingin tahu apakah sesuatu itu benda "biasa", artinya benda itu dibuat secara literal
{}
atau denganObject.create(null)
, Anda bisa melakukan ini:Sunting 2018 : Karena
Symbol.toStringTag
sekarang memungkinkan menyesuaikan keluaranObject.prototype.toString.call(...)
,isPlainObject
fungsi di atas mungkin kembalifalse
dalam beberapa kasus bahkan ketika objek memulai hidupnya sebagai literal. Dapat diperdebatkan, dengan konvensi objek dengan tag string khusus bukan objek polos lagi, tetapi ini telah semakin memperkeruh definisi apa objek polos bahkan dalam Javascript.sumber
instanceof Object
, dua literal fungsi identik tidak sepenuhnya sama, mereka dilewatkan dengan referensi, dll.Ya Tuhan, terlalu banyak kebingungan dalam jawaban lain.
Jawaban singkat
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array)
Untuk menguji ini cukup jalankan pernyataan berikut di konsol chrome.
Kasus 1.
Kasus 2.
Kasus 3.
Penjelasan
Oke. Mari kita jabarkan
typeof anyVar == 'object'
dikembalikan benar dari tiga kandidat -[], {} and null
,anyVar instanceof Object
mempersempit kandidat ini menjadi dua -[], {}
!(anyVar instanceof Array)
menyempit menjadi hanya satu -{}
Gulung drum!
Dengan ini, Anda mungkin sudah belajar cara memeriksa Array di Javascript.
sumber
false
(seperti yang diinginkan) ketikaanyVar
suatu fungsi.Cara paling masuk akal untuk memeriksa jenis nilai tampaknya adalah
typeof
operator. Satu-satunya masalah adalah bahwa itu rusak parah:"object"
untuknull
, yang termasuk tipe Null."function"
untuk objek yang bisa dipanggil, yang termasuk tipe objek."unknown"
. Satu-satunya hasil terlarang adalah"function"
dan tipe primitif.typeof
hanya dapat diandalkan untuk non-null
primitif. Jadi cara untuk memeriksa apakah suatu nilai adalah objek akan memastikan bahwa string yang dikembalikan olehtypeof
tidak sesuai dengan primitif, dan bahwa objek tersebut tidaknull
. Namun, masalahnya adalah bahwa standar masa depan dapat memperkenalkan tipe primitif baru, dan kode kami akan menganggapnya sebagai objek. Jenis baru tidak sering muncul, tetapi misalnya ECMAScript 6 memperkenalkan jenis Simbol.Oleh karena itu, alih-alih
typeof
, saya hanya merekomendasikan pendekatan yang hasilnya bervariasi tergantung pada apakah nilainya adalah objek atau tidak. Berikut ini dimaksudkan untuk menjadiDaftar lengkap namun tidak lengkap tentang cara yang tepat untuk menguji apakah suatu nilai termasuk dalam tipe Objek.
Object
konstruktorThe
Object
konstruktor memaksa argumen dilewatkan ke suatu objek. Jika sudah menjadi objek, objek yang sama dikembalikan.Oleh karena itu, Anda dapat menggunakannya untuk memaksa nilai ke suatu objek, dan secara ketat membandingkan objek itu dengan nilai aslinya.
Fungsi berikut membutuhkan ECMAScript 3, yang memperkenalkan
===
:Saya suka pendekatan ini karena sederhana dan deskriptif diri, dan cek analog juga akan berfungsi untuk boolean, angka, dan string. Namun, ketahuilah bahwa ini bergantung pada global yang
Object
tidak dibayangi atau diubah.Konstruktor
Ketika Anda instantiate konstruktor, itu bisa mengembalikan nilai yang berbeda dari contoh yang baru saja dibuat. Tetapi nilai itu akan diabaikan kecuali itu adalah objek.
Fungsi berikut membutuhkan ECMAScript 3, yang memungkinkan konstruktor untuk mengembalikan non-objek. Sebelum ECMAScript 3 yang melemparkan kesalahan, tetapi
try
pernyataan tidak ada saat itu.Meskipun sedikit kurang sederhana dari contoh sebelumnya, yang satu ini tidak bergantung pada properti global apa pun, dan karenanya mungkin yang paling aman.
this
nilaiSpesifikasi ECMAScript lama membutuhkan
this
nilai untuk menjadi objek. ECMAScript 3 diperkenalkanFunction.prototype.call
, yang memungkinkan untuk memanggil fungsi denganthis
nilai arbitrer , tetapi dipaksa untuk suatu objek.ECMAScript 5 memperkenalkan mode ketat yang menghapus perilaku ini, tetapi dalam mode ceroboh kita masih bisa (tapi tidak boleh tidak) mengandalkannya.
[[Prototipe]]
Semua objek biasa memiliki slot internal yang disebut [[Prototipe]], yang nilainya menentukan dari objek mana ia mewarisi. Nilai hanya bisa berupa objek atau
null
. Oleh karena itu, Anda dapat mencoba membuat objek yang mewarisi dari nilai yang diinginkan, dan memeriksa apakah itu berfungsi.Keduanya
Object.create
danObject.getPrototypeOf
membutuhkan ECMAScript 5.Beberapa cara ECMAScript 6 baru
ECMAScript 6 memperkenalkan beberapa cara tidak langsung baru untuk mengecek apakah suatu nilai adalah objek. Mereka menggunakan pendekatan yang terlihat sebelumnya untuk meneruskan nilai ke beberapa kode yang membutuhkan objek, dibungkus di dalam
try
pernyataan untuk menangkap kesalahan. Beberapa contoh tersembunyi, tidak layak dikomentariTampilkan cuplikan kode
Tampilkan cuplikan kode
Catatan: Saya sengaja melewatkan beberapa pendekatan seperti
Object.getPrototypeOf(value)
(ES5) danReflect
metode (ES6) karena mereka menyebut metode internal penting yang mungkin melakukan hal-hal buruk, misalnya jikavalue
merupakan proxy. Untuk alasan keamanan, contoh saya hanya referensivalue
tanpa mengaksesnya secara langsung.sumber
Coba ini
sumber
Object.prototype instanceof Object
-> salah.Object.create(null) instanceof Object
-> salah.new Date() instanceof Object
=> trueFungsi siap pakai untuk memeriksa
Penjelasan
Dalam Javascript,
null
,Object
,Array
,Date
danfunction
s adalah semua benda. Meskipunnull
sedikit dibuat-buat. Jadi, lebih baik untuk memeriksa yangnull
pertama, untuk mendeteksi itu bukan nol.Memeriksa
typeof o === 'object'
jaminan yango
merupakan objek. Tanpa pemeriksaan ini, tidakObject.prototype.toString
akan ada artinya, karena akan mengembalikan objek untuk selamanya, bahkan untukundefined
dannull
! Sebagai contoh:toString(undefined)
kembali[object Undefined]
!Setelah
typeof o === 'object'
memeriksa, toString.call (o) adalah metode yang bagus untuk memeriksa apakaho
suatu objek, objek yang diturunkan sepertiArray
,Date
atau afunction
.Secara
isDerivedObject
fungsi, ia memeriksao
fungsi. Karena, berfungsi juga sebagai objek, itu sebabnya ia ada di sana. Jika tidak melakukannya, fungsi akan kembali sebagai false. Contoh:isDerivedObject(function() {})
akan kembalifalse
, namun sekarang kembalitrue
.Seseorang selalu dapat mengubah definisi apa itu objek. Jadi, seseorang dapat mengubah fungsi-fungsi ini sesuai.
Tes
sumber
Jika Anda ingin memeriksa apakah
prototype
untukobject
hanya berasal dariObject
. MenyaringString
,Number
,Array
,Arguments
, dllAtau sebagai fungsi panah ekspresi tunggal (ES6 +)
sumber
return Object.prototype.toString.call(n) === '[object Object]'
null
cek, karenaObject.prototype.toString.call(null) === '[object Null]'
Saya diminta untuk memberikan rincian lebih lanjut. Cara paling bersih dan mudah dimengerti untuk memeriksa apakah variabel kita adalah objek
typeof myVar
. Ini mengembalikan string dengan tipe (misalnya"object"
,"undefined"
).Sayangnya baik Array dan null juga memiliki tipe
object
. Untuk hanya mengambil objek nyata ada kebutuhan untuk memeriksa rantai pewarisan menggunakaninstanceof
operator. Ini akan menghilangkan null, tetapi Array memiliki Object dalam rantai pewarisan.Jadi solusinya adalah:
sumber
/./ instanceof Object //true
Agak terlambat ... untuk "objek biasa" (maksud saya, seperti {'x': 5, 'y': 7}) saya punya cuplikan kecil ini:
Ini menghasilkan output berikutnya:
Itu selalu berhasil untuk saya. Jika akan mengembalikan "true" hanya jika jenis "o" adalah "objek", tetapi tidak ada null, atau array, atau fungsi. :)
sumber
lodash memiliki isPlainObject , yang mungkin dicari oleh banyak orang yang datang ke halaman ini. Ini mengembalikan false ketika memberikan fungsi atau array.
sumber
_.isObject
apa yang cocok dengan apa yang JS anggap sebagai objek. Tetapi apa yang biasanya saya butuhkan adalah untuk membedakan antara misalnya objek literal dan array, yang persis apa yang_.isPlainObject
memungkinkan saya lakukan.Ini akan bekerja Ini adalah fungsi yang mengembalikan true, false, atau mungkin null.
sumber
null
hasil untuk ujian akhir daripadafalse
. Lihat Kapan saya harus mengedit kode?Karena tampaknya ada banyak kebingungan tentang bagaimana menangani masalah ini dengan benar, saya akan meninggalkan 2 sen saya (jawaban ini sesuai dengan spesifikasi dan menghasilkan hasil yang benar dalam semua keadaan):
Menguji primitif:
undefined
null
boolean
string
number
Objek bukan primitif:
Atau sebagai alternatif:
Menguji berbagai Array:
Menguji objek tidak termasuk:
Date
RegExp
Boolean
Number
String
Function
any Arraysumber
Ketika semuanya gagal, saya menggunakan ini:
sumber
item.constructor === Object
?null
melempar pengecualianUncaught TypeError: Cannot read property 'constructor' of null(…)
indexOf
atau karenaconstructor.name
?The Ramda perpustakaan fungsional memiliki fungsi yang indah untuk mendeteksi jenis JavaScript.
Mengutip fungsi penuh :
Saya harus tertawa ketika saya menyadari betapa sederhana dan indah solusinya.
Contoh penggunaan dari dokumentasi Ramda :
sumber
Setelah membaca dan mencoba banyak implementasi, saya telah memperhatikan bahwa sangat sedikit orang mencoba untuk memeriksa nilai-nilai seperti
JSON
,Math
,document
atau benda dengan rantai prototipe lebih dari 1 langkah.Daripada memeriksa
typeof
variabel kami dan kemudian meretas kasus tepi, saya pikir akan lebih baik jika pemeriksaan dijaga sesederhana mungkin untuk menghindari keharusan refactor ketika ada primitif baru atau objek asli yang ditambahkan yang mendaftar sebagaitypeof
'objek 'Lagi pula,
typeof
operator akan memberi tahu Anda jika ada sesuatu yang menjadi objek JavaScript , tetapi definisi JavaScript tentang objek terlalu luas untuk sebagian besar skenario dunia nyata (mistypeof null === 'object'
.). Di bawah ini adalah fungsi yang menentukan apakah variabelv
adalah objek dengan dasarnya mengulangi dua pemeriksaan:v
adalah'[object Object]'
.Saya ingin hasil fungsi persis seperti log di bawah ini, jadi ini adalah satu-satunya "objektivitas" -kriteria yang saya dapatkan. Jika gagal, fungsi mengembalikan false segera.
v
diganti dengan prototipe berikutnya dalam rantai denganv = Object.getPrototypeOf(v)
, tetapi juga langsung dievaluasi setelahnya. Ketika nilai baruv
adalahnull
, itu berarti bahwa setiap prototipe termasuk root prototipe (yang bisa saja merupakan satu - satunya prototipe di dalam rantai) telah lulus pemeriksaan di loop sementara dan kita dapat mengembalikan true. Kalau tidak, iterasi baru akan dimulai.sumber
sumber
value
adalahnull
ini akan melemparkan kesalahan ...false
untuk objekObject.assign({}, {constructor: null})
.Jika secara eksplisit ingin memeriksa apakah nilai yang diberikan adalah
{}
.sumber
!!obj
adalah singkatan untuk memeriksa apakahobj
benar (untuk menyaringnull
)sumber
Ini adalah pertanyaan lama tetapi berpikir untuk meninggalkan ini di sini. Kebanyakan orang memeriksa apakah variabel tersebut
{}
berarti kunci-nilai yang dipasangkan dan bukan apa yang digarisbawahi oleh JavaScript yang digunakan untuk suatu hal, karena jujur sebagian besar segala sesuatu dalam JavaScript adalah objek. Jadi hilangkan itu. Jika kamu melakukan...Sebagian besar waktu yang kita inginkan adalah untuk mengetahui apakah kita memiliki objek sumber daya dari API atau panggilan basis data kita yang dikembalikan dari ORM. Kita dapat menguji apakah bukan
Array
, bukannull
, bukan tipe'function'
, dan merupakanObject
sumber
true
fornew Date()
new Date()
Yang saya suka gunakan adalah ini
Saya pikir dalam sebagian besar kasus Tanggal harus lulus cek sebagai Obyek, jadi saya tidak menyaring tanggal
sumber
saya menemukan cara "baru" untuk melakukan semacam ini memeriksa dari pertanyaan SO ini: Mengapa instanceof kembali false untuk beberapa literal?
dari itu, saya membuat fungsi untuk pengecekan tipe sebagai berikut:
maka Anda bisa melakukan:
ini diuji pada Chrome 56, Firefox 52, Microsoft Edge 38, Internet Explorer 11, Opera 43
sunting:
jika Anda juga ingin memeriksa apakah suatu variabel nol atau tidak terdefinisi, Anda dapat menggunakan ini sebagai gantinya:
pembaruan dari komentar inanc: tantangan diterima: D
jika Anda ingin kehilangan objek perbandingan Anda dapat mencoba cara ini:
dengan begitu, Anda dapat melakukan seperti komentar inanc:
atau
sumber
instanceof
untuk memeriksa objek. Namun, ini bukan ilmu pasti.new Foo()
mengembalikanFoo
objek, sama sepertinew String()
mengembalikanString
objek, ataunew Date()
mengembalikanDate
objek, AndaFoo = function(){}; isVarTypeOf(new Foo(), Foo);
juga bisa melakukannya