Adakah yang tahu bagaimana saya bisa mengecek apakah suatu variabel adalah angka atau string dalam JavaScript?
javascript
types
Jin Yong
sumber
sumber
Jawaban:
Jika Anda berurusan dengan notasi literal, dan bukan konstruktor, Anda dapat menggunakan typeof :.
Jika Anda membuat angka dan string melalui konstruktor, seperti
var foo = new String("foo")
, Anda harus ingat bahwatypeof
mungkin kembaliobject
untukfoo
.Mungkin metode yang lebih mudah memeriksa jenis akan menggunakan metode yang ditemukan di underscore.js (sumber beranotasi dapat ditemukan di sini ),
Ini mengembalikan boolean
true
untuk yang berikut:sumber
var myString = new String("stuff I like"); isString(myString)
ini mengembalikan false. Juga, saya tidak yakin berapa lama konversi backgroiund berlangsung, saya tahu kapan saya memanggil "hai". Panjang, "hai" akan dikonversi menjadi objek, tidak yakin seberapa cepat ia akan dikonversi kembali atau jika itu pernah terikat ke variabel.Cara terbaik untuk melakukannya adalah menggunakan
isNaN
casting tipe +:Metode all-in yang diperbarui:
Menggunakan regex yang sama:
sumber
null
dipaksa menjadi 0 dan mengembalikan true untukisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
Cara terbaik yang saya temukan adalah memeriksa metode di string, yaitu:
atau jika Anda ingin melakukan sesuatu dengan memeriksa nomor untuk properti nomor,
Ini seperti "mengetik bebek", terserah Anda mana cara yang paling masuk akal. Saya tidak memiliki cukup karma untuk berkomentar, tetapi typeof gagal untuk string dan angka kotak, yaitu:
akan mengingatkan "objek".
sumber
typeof
karena selalu dapat menguji string, apakah objek primitif atau String. Anda hanya perlu menguji metode yang unik untuk jenis yang Anda inginkan.{substring:"hello"}
. Saya tahu untuk tujuan saya, saya hanya menguji apa operasi spesifik yang perlu saya lakukan (modulus) lakukan untuk tipe yang saya perlu periksa (pada modulus string pengembalian tidak terdefinisi) kemudian memeriksa untuk itu daripada mendapatkan jenis itu.Anda sedang mencari
isNaN()
:Lihat JavaScript isNaN () Berfungsi di MDN.
sumber
isNaN
pengembalianfalse
untuknull
(tetapitrue
untukundefined
).Periksa apakah nilainya berupa string literal atau objek String:
Tes unit:
Memeriksa nomornya serupa:
sumber
function is (type, value) { return value["constructor"] === type; }
?Karena ES2015 cara yang benar untuk memeriksa apakah suatu variabel memiliki angka yang valid
Number.isFinite(value)
Contoh:
sumber
Coba ini,
sumber
Cara terbaik untuk melakukan ini:
Ini memenuhi uji kasus berikut:
sumber
Atau sesuaikan untuk mengembalikan jenis yang tidak dikenal:
Pembaruan 12 Mei 2012: Contoh lengkap di Javascript: A Better typeof .
sumber
realTypeOf
:realTypeOf(NaN) -> "Number"
perilaku yang sama seperti yangtypeof
disepakati tetapi masih jauh dari ideal.Berikut adalah pendekatan yang didasarkan pada gagasan untuk memaksa input ke angka atau string dengan menambahkan nol atau string nol, dan kemudian melakukan perbandingan kesetaraan yang diketik.
Untuk beberapa alasan yang tak terduga,
x===x+0
tampaknya berkinerja lebih baik daripadax===+x
.Apakah ada kasus di mana ini gagal?
Dalam nada yang sama:
Ini tampaknya sedikit lebih cepat daripada salah satu
x===true || x===false
atautypeof x==="boolean"
(dan jauh lebih cepat daripadax===Boolean(x)
).Lalu ada juga
Semua ini tergantung pada keberadaan operasi "identitas" khusus untuk setiap jenis yang dapat diterapkan pada nilai apa pun dan secara andal menghasilkan nilai dari jenis yang dimaksud. Saya tidak bisa memikirkan operasi semacam itu untuk kencan.
Untuk NaN, ada
Ini pada dasarnya adalah versi garis bawah, dan seperti berdiri sekitar empat kali lebih cepat daripada
isNaN()
, tetapi komentar dalam sumber garis bawah menyebutkan bahwa "NaN adalah satu-satunya angka yang tidak sama dengan dirinya sendiri" dan menambahkan tanda centang untuk _.isNumber. Mengapa? Benda apa lagi yang tidak akan menyamai diri mereka sendiri? Juga, garis bawah menggunakan -x !== +x
tetapi apa bedanya+
sini?Kemudian untuk paranoid:
atau ini
sumber
Bisakah Anda membaginya dengan 1?
Saya berasumsi bahwa masalahnya adalah input string seperti: "123ABG"
Hanya cara saya melakukannya baru-baru ini.
sumber
eh, bagaimana kalau saja:
Setelah ditinjau lebih lanjut berbulan-bulan kemudian, jaminan ini hanya
obj
objek yang memiliki metode atau nama properti yangtoLowerCase
ditentukan. Saya malu dengan jawaban saya. Silakan lihattypeof
salah satu yang terpilih .sumber
Atau cukup gunakan invert dari
isNaN()
:Dan ya, menggunakan jQuery
$.isNumeric()
lebih menyenangkan.sumber
isNaN('123')
memberikan false, meskipun argumennya adalah string numerik dan bukan tipe numerikSaya pikir mengkonversi var ke string mengurangi kinerja, setidaknya tes ini dilakukan di browser terbaru.
Jadi jika Anda peduli tentang kinerja, saya akan, saya akan menggunakan ini:
untuk memeriksa apakah variabel tersebut adalah string (bahkan jika Anda menggunakan
var str = new String("foo")
,str instanceof String
akan mengembalikan true).Adapun memeriksa apakah itu nomor saya akan pergi untuk asli
isNaN
:; fungsi.sumber
jQuery menggunakan ini:
sumber
Solusi ini menyelesaikan banyak masalah yang diangkat di sini!
Sejauh ini, ini adalah metode paling andal yang saya gunakan. Saya tidak menciptakan ini, dan tidak dapat mengingat di mana saya awalnya menemukannya. Tapi itu berfungsi ketika teknik lain gagal:
Contoh kebenaran
sumber
typeof
metode asli (0,788 vs 1,481) di Chrome. Ini tentu saja kinerja yang dapat diterima mengingat hasil yang ditingkatkan. Menurut Anda mengapa ini "sangat lambat?" Mungkin itu - di IE6 / 7/8? Tapi semuanya "sangat lambat" di browser tersebut.typeof
100x lebih cepat, apa yang saya lewatkan?Hanya FYI, jika Anda menggunakan jQuery yang Anda miliki
untuk menangani ini. Lebih detail tentang http://api.jquery.com/jQuery.isNumeric/
sumber
typeof bekerja sangat baik bagi saya dalam banyak kasus. Anda dapat mencoba menggunakan pernyataan if
di mana x adalah nama variabel apa pun pilihan Anda
sumber
cara terbaik yang saya temukan yang juga memikirkan angka positif dan negatif adalah dari: O'Reilly Javascript dan DHTML Cookbook :
}
sumber
Errr? Cukup gunakan ekspresi reguler! :)
sumber
karena string seperti '1234' dengan typeof akan menampilkan 'string', dan kebalikannya tidak akan pernah terjadi (typeof 123 akan selalu berupa angka), yang terbaik adalah menggunakan regex sederhana
/^\-?\d+$/.test(var)
. Atau yang lebih maju untuk mencocokkan float, bilangan bulat dan angka negatif,/^[\-\+]?[\d]+\.?(\d+)?$/
Sisi penting.test
adalah bahwa ia TIDAK akan melempar pengecualian jika var bukan string, nilainya bisa apa saja.Jika Anda mencari tipe nyata, maka typeof saja yang akan dilakukan.
sumber
@ Jawaban BitOfUniverse baik, dan saya menemukan cara baru:
Saya tahu
0
tidak bisa dividen, tapi di sini fungsinya bekerja dengan sempurna.sumber
Ketik memeriksa
Anda dapat memeriksa jenis variabel dengan menggunakan
typeof
operator:Pengecekan nilai
Kode di bawah ini mengembalikan true untuk angka dan false untuk hal lain:
sumber
typeof
operator! @JustAMartinnumber
tetapi jika saya melewati '123' atau 'abc' atau literal lainnya yang dikutip, itu adalah string, dan tidak masalah apakah itu dapat diurai menjadi angka atau tidak.Operasi XOR dapat digunakan untuk mendeteksi angka atau string. angka ^ 0 akan selalu memberikan angka sebagai output dan string ^ 0 akan memberikan 0 sebagai output.
sumber
Sederhana dan menyeluruh:
Kasus uji:
sumber
Cukup gunakan
atau
jika Anda ingin menangani string yang didefinisikan sebagai objek atau literal dan menyimpan Anda tidak ingin menggunakan fungsi pembantu.
sumber
sumber
Sangat terlambat ke pesta; Namun, berikut ini selalu bekerja dengan baik untuk saya ketika saya ingin memeriksa apakah beberapa input adalah string atau angka dalam satu kesempatan.
sumber
Membuat jsperf pada pemeriksaan jika variabel adalah angka. Cukup menarik! typeof sebenarnya memiliki penggunaan kinerja. Menggunakan
typeof
untuk apa pun selain angka, biasanya bergerak 1/3 kecepatan sebagai avariable.constructor
karena mayoritas tipe data dalam javascript adalah Objects; angka tidak!http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-nnumber
typeof variable === 'number'
| tercepat | jika Anda ingin nomor, seperti 5, dan bukan '5'typeof parseFloat(variable) === 'number'
| tercepat | jika Anda ingin nomor, seperti 5, dan '5'isNaN()
lebih lambat, tapi tidak terlalu lambat. Saya memiliki harapan tinggi untukparseInt
danparseFloat
, namun mereka sangat lambat.sumber
Untuk mendeteksi angka, bagian berikut dari JavaScript: Bagian Baik oleh Douglas Crockford relevan:
sumber