Anda dapat menggunakan typeof
operator:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Contoh dari halaman web ini . (Contoh sedikit dimodifikasi).
Ini tidak akan berfungsi seperti yang diharapkan dalam kasus string yang dibuat dengan new String()
, tetapi ini jarang digunakan dan direkomendasikan terhadap [1] [2] . Lihat jawaban lain untuk cara menanganinya, jika diinginkan.
- Panduan Gaya Google JavaScript mengatakan untuk tidak pernah menggunakan pembungkus objek primitif .
- Douglas Crockford merekomendasikan agar pembungkus objek primitif tidak digunakan lagi .
new String('foo')
, tetapi itu tidak masalah karena string yang dibungkus objek adalah fitur yang tidak berharga yang tidak boleh Anda gunakan. Panduan gaya Google melarang mereka , Douglas Crockford menginginkannya tidak digunakan lagi , dan tidak ada perpustakaan yang menggunakannya. Berpura-pura mereka tidak ada, dan gunakantypeof
tanpa rasa takut.typeof
sudah usang juga?Inilah yang bekerja untuk saya:
sumber
instanceof
centang di sini adalah kebisingan yang tidak ada gunanya kecuali Anda mengikuti beberapa praktik pengkodean yang sangat tidak biasa , dan jawaban ini tidak menjelaskan apa yang dilakukannya atau mengapa Anda menggunakannya. Satu-satunya alasan Anda membutuhkannya adalah jika Anda menggunakan string yang dibungkus objek, tetapi string yang dibungkus objek adalah fitur yang tidak berharga yang tidak digunakan oleh siapa pun dan Google dan Crockford keduanya mengutuk sebagai praktik yang buruk ( google-styleguide.googlecode.com/svn/ trunk / ... , crockford.com/javascript/recommend.html ).typeof
daninstanceof
terasa seperti saran yang bagus jika kode Anda dapat dipanggil oleh orang lain. @ Kasuspostmessage
tepi MarkAmery penting jika Anda bertanya "apa yang baru saja aku lakukanpostmessage
?" - tetapi Anda berharap itu ditangani di antarmuka dan tidak diizinkan untuk diperbanyak. Di tempat lain, tampaknya benar untuk menangani metode pengkodean yang tidak usang bahkan jika beberapa JS aesthetes tidak menyetujuinya. TIDAK PERNAH mengomentari kode Anda sebagai menerima String, kecuali jika benar-benar melakukannya!Karena 580+ orang telah memilih jawaban yang salah, dan 800+ telah memilih jawaban yang berfungsi tetapi bergaya senapan, saya pikir mungkin layak untuk mengulang jawaban saya dalam bentuk yang lebih sederhana yang dapat dipahami semua orang.
Atau, inline (Saya memiliki pengaturan UltiSnip untuk ini):
FYI, jawaban Pablo Santa Cruz salah, karena
typeof new String("string")
memang begituobject
Jawaban DRAX akurat dan fungsional, dan seharusnya menjadi jawaban yang benar (karena Pablo Santa Cruz jelas salah, dan saya tidak akan berdebat menentang pemilihan umum).
Namun, jawaban ini juga pasti benar, dan sebenarnya jawaban terbaik (kecuali, mungkin, untuk saran menggunakan lodash / garis bawah ). disclaimer: Saya berkontribusi pada basis kode lodash 4.
Jawaban asli saya (yang jelas terbang tepat di atas banyak kepala) berikut:
Saya mentranskode ini dari underscore.js:
Itu akan menentukan isString, isNumber, dll.
Di Node.js, ini bisa diimplementasikan sebagai modul:
[sunting]:
Object.prototype.toString.call(x)
berfungsi untuk menggambarkan antara fungsi dan fungsi asink juga:sumber
global || window
alih-alihwindow
tetapi itu akan menjadi pendekatan yang buruk untuk memecahkan masalah yang seharusnya tidak Anda miliki di tempat pertama).myObject+"" === myObject
untuk memeriksa apakah suatu objek adalah string (atau bahkan lebih baik, saya tidak akan mengetikkan check-in dalam sistem tipe driven perilaku di tempat pertama).toString
diObject.prototype
. Jadi, saya berpendapat bahwa mengandalkantoString
memeriksa jenis objek, paling tidak, merupakan praktik yang buruk.Saya sarankan menggunakan fungsi bawaan dari jQuery atau lodash / Underscore . Mereka lebih mudah digunakan dan lebih mudah dibaca.
Salah satu fungsi akan menangani kasus DRAX yang disebutkan ... yaitu, mereka berdua memeriksa apakah (A) variabel tersebut adalah string literal atau (B) itu adalah turunan dari objek String. Dalam kedua kasus, fungsi-fungsi ini dengan benar mengidentifikasi nilai sebagai string.
lodash / Underscore.js
jQuery
Lihat Dokumentasi lodash untuk _.isString () untuk lebih jelasnya.
Lihat Dokumentasi jQuery untuk $ .type () untuk detail lebih lanjut.
sumber
_.every()
sedikit membingungkan untuk digunakan pada awalnya, dan sesuatu yang sederhana seperti_.isBoolean()
devs bingung di perusahaan saya. Seorang dev keliru berpikir itu akan salah jika nilainya boolean dan salah. Bahasa Inggris lebih mudah dibaca daripada bahasa Jerman untuk saya, karena saya tidak tahu bahasa Jerman. Pelajari JavaScript dan itu semua masuk akal.Saya melihat itu di sini:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
sumber
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
memiliki keterbacaan yang lebih baik daripadax === y
?Cara terbaik:
Masing-masing telah dibangun oleh fungsi kelas yang sesuai, seperti "Objek baru ()" dll.
Juga, Bebek Mengetik: "Jika itu terlihat seperti bebek, berjalan seperti bebek, dan baunya seperti bebek - itu pasti sebuah Array" Artinya, periksa propertinya.
Semoga ini membantu.
Edit; 12/05/2016
Ingat, Anda selalu dapat menggunakan kombinasi pendekatan juga. Berikut adalah contoh menggunakan peta tindakan inline dengan typeof :
Berikut contoh yang lebih 'dunia nyata' dalam menggunakan inline-maps:
Fungsi ini akan menggunakan [custom] "type-casting" - lebih tepatnya, "type - / - value-mapping" - untuk mengetahui apakah suatu variabel benar-benar "ada". Sekarang Anda dapat memisahkan rambut jahat antara
null
&0
!Sering kali Anda bahkan tidak peduli dengan tipenya . Cara lain untuk menghindari pengetikan adalah menggabungkan set Duck-Type:
Keduanya
Number.prototype
danString.prototype
memiliki.toString() method
. Anda hanya memastikan bahwa string-setara dengan nomor itu sama, dan kemudian Anda memastikan bahwa Anda meneruskannya ke dalamhttp
fungsi sebagai aNumber
. Dengan kata lain, kami bahkan tidak peduli apa jenisnya.Harapan yang memberi Anda lebih banyak untuk dikerjakan :)
sumber
(o.constructor === Number || s.constructor === Boolean)
). Secara anekdot,parseInt
danNaN
merupakan alat yang rapuh tetapi kuat. Ingat saja, Not-a-Number TIDAK NOT-a-Number, dan undefined dapat didefinisikan.if(thing.call) { 'its a function'; }
atauif(thing.defineProperties) { 'its an object'; }
. Terima kasih atas masukannya, axkibe!Jujur saya tidak bisa melihat mengapa orang tidak akan hanya menggunakan
typeof
dalam kasus ini:Ya itu akan gagal terhadap string yang dibungkus objek (misalnya
new String('foo')
) tetapi ini secara luas dianggap sebagai praktik yang buruk dan sebagian besar alat pengembangan modern cenderung untuk mencegah penggunaannya. (Jika Anda melihatnya, perbaiki saja!)The
Object.prototype.toString
trick adalah sesuatu yang semua pengembang front-end telah ditemukan bersalah melakukan satu hari dalam karir mereka tapi jangan biarkan hal itu menipu Anda dengan cat nya pintar: itu akan pecah secepat sesuatu monyet-patch Obyek prototipe:sumber
Saya suka menggunakan solusi sederhana ini:
sumber
undefined
dannull
, dan masih mendapatkan jawaban yang tepat untuk string kosong (keduanya''
dannew String('')
).(mystring || false) && mystring.constructor === String
. Saya menggunakan false jika digunakan dalam fungsi yang harus mengembalikan boolean.Ini adalah contoh bagus mengapa kinerja penting:
Melakukan sesuatu yang sederhana seperti tes untuk sebuah string bisa mahal jika tidak dilakukan dengan benar.
Misalnya, jika saya ingin menulis fungsi untuk menguji apakah ada sesuatu yang berupa string, saya bisa melakukannya dengan salah satu dari dua cara:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Kedua hal ini sangat lurus ke depan, jadi apa yang bisa berdampak pada kinerja? Secara umum, panggilan fungsi bisa mahal, terutama jika Anda tidak tahu apa yang terjadi di dalam. Pada contoh pertama, ada pemanggilan fungsi ke metode toString Object. Dalam contoh kedua, tidak ada panggilan fungsi, karena typeof dan instanceof adalah operator. Operator jauh lebih cepat daripada panggilan fungsi.
Ketika kinerja diuji, contoh 1 adalah 79% lebih lambat dari contoh 2!
Lihat tes: https://jsperf.com/isstringtype
sumber
typeof str === 'string' || str instanceof String
(dapat menghapus tanda kurung yang saya sukai dalamif (..)
kasus); bagaimanapun, memeriksa baik tipe primitif dan objek dalam # 2 jelas dan memadai. Pemeriksaan ini harus 'jarang'.Berfungsi untuk string literal
let s = 'blah'
dan untuk Object Stringslet s = new String('blah')
sumber
Diambil dari lodash:
sumber
Saya pikir solusi @customcommander harus mencukupi dalam 90% kasus Anda:
Harus melayani Anda dengan benar (hanya karena biasanya tidak ada alasan untuk ada
new String('something')
dalam kode Anda).Jika Anda tertarik untuk menangani
String
objek juga (misalnya Anda mengharapkan beberapa var dari pihak ke-3) kemudian menggunakan lodash seperti yang disarankan @ ClearCloud8 tampaknya seperti solusi yang jelas, sederhana dan elegan.Namun saya menyarankan untuk berhati-hati dengan perpustakaan seperti lodash karena ukurannya. Alih-alih melakukan
Yang membawa seluruh objek lodash besar, saya sarankan sesuatu seperti:
Dan dengan bundling sederhana Anda harus baik-baik saja (saya merujuk di sini ke kode klien).
sumber
Jika Anda bekerja di lingkungan node.js, Anda cukup menggunakan fungsi built-in isString di utils.
Sunting: seperti yang disebutkan @Jehy, ini sudah tidak digunakan lagi sejak v4.
sumber
typeof value === 'string'
saja."x = new String('x'); x.isString(x);
mengembalikan salah . Adautil.types.isStringObject()
tapi itu mengembalikan false untukx = 'x'
tipe string. Dua fungsi utilitas yang sama sekali tidak menyediakan utilitas ...Metode berikut akan memeriksa apakah ada variabel yang berupa string ( termasuk variabel yang tidak ada ).
sumber
Saya juga menemukan bahwa ini berfungsi dengan baik juga, dan jauh lebih pendek daripada contoh lainnya.
Dengan menggabungkan pada kutipan kosong itu mengubah nilai menjadi string. Jika
myVar
sudah menjadi string maka pernyataan if berhasil.sumber
typeof
.typeof
tetapi masih sedikit lebih cepat daritoString
. Either way, saya kira saya hanya suka sintaksis untuk paksaan.var s = new String('abc'); > s === s + '' > false
new String
cus yang menciptakan tipeobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2sumber
false
.Saya menemukan teknik sederhana ini berguna untuk mengetik-periksa String -
Teknik yang sama juga berfungsi untuk Angka -
Dan untuk RegExp -
Sama untuk Objek -
NB, regexps, array, dan fungsi juga dianggap objek.
Tapi, memeriksa Array agak berbeda -
Namun teknik ini tidak berfungsi untuk Fungsi -
sumber
var x = new String(x); String(x)===x
mengembalikan salah. namun({}).toString.call(x).search(/String/)>0
selalu kembali untuk halfunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
atauisClass(3,/Number/)
atauisClass(null,/Null/)
Solusi sederhana adalah:
sumber
toString()
berfungsi.toString
nilai apa pun; coba jika x yang akan diperiksa adalah nol atau tidak terdefinisi, pengecualian melempar kode AndatoString()
metode mungkin ditimpa dan dapat menimbulkan pengecualian (karena beberapa implementasi tertentu), dan cek Anda tidak akan bekerja dengan pasti. Gagasan utama adalah bahwa Anda tidak boleh memanggil metode yang tidak terkait dengan apa yang ingin Anda dapatkan. Saya bahkan tidak berbicara tentang overhead yang tidak perlu terkait dengantoString
metode ini. Downvoting.Seorang pembantu Typechecker:
pemakaian:
Juga jika Anda ingin menjadi rekursif (seperti Array yang merupakan Obyek), Anda dapat menggunakan
instanceof
.(
['cs'] instanceof Object //true
)sumber
Saya akan pergi ke rute yang berbeda ke yang lain di sini, yang mencoba untuk mengetahui apakah suatu variabel adalah spesifik, atau anggota dari set tertentu, jenis.
JS dibangun di atas ducktyping; jika sesuatu berdetak seperti string, kita bisa dan harus menggunakannya seperti string.
Apakah
7
sebuah string? Lalu mengapa/\d/.test(7)
berhasil?Apakah
{toString:()=>('hello there')}
sebuah string? Lalu mengapa({toString:()=>('hello there')}) + '\ngeneral kenobi!'
berhasil?Ini bukan pertanyaan tentang apakah pekerjaan di atas, intinya adalah mereka melakukannya.
Jadi saya membuat
duckyString()
fungsiDi bawah ini saya menguji banyak kasus yang tidak dipenuhi oleh jawaban lain. Untuk setiap kode:
duckyString()
kepada Anda untuk menormalkan input untuk kode yang mengharapkan string nyataIni berada dalam nada yang sama
!!x
sebagai lawanx===true
dan menguji apakah ada sesuatu yang seperti array bukan memerlukan array yang sebenarnya.objek jQuery; apakah mereka array? Tidak. Apakah mereka cukup baik? Ya, Anda dapat menjalankannya melalui
Array.prototype
fungsi dengan baik.Fleksibilitas inilah yang memberi JS kekuatannya, dan pengujian untuk string secara spesifik membuat kode Anda kurang dapat dioperasikan.
Output di atas adalah:
Jadi, ini semua tentang mengapa Anda ingin tahu apakah ada masalah.
Jika, seperti saya, Anda tiba di sini dari google dan ingin melihat apakah ada sesuatu yang mirip string , inilah jawabannya.
Itu bahkan tidak mahal kecuali jika Anda bekerja dengan array char sangat panjang atau sangat bersarang.
Ini karena itu semua jika pernyataan, tidak ada fungsi panggilan suka
.toString()
.Kecuali jika Anda mencoba untuk melihat apakah array char dengan objek yang hanya memiliki
toString()
karakter multi-byte, dalam hal ini tidak ada cara lain untuk memeriksa kecuali untuk membuat string, dan menghitung karakter byte, masing-masing.Termasuk pilihan untuk
.toString()
)Berikut ini lebih banyak tes karena saya seorang penyelesaian:
Keluaran:
sumber
Hanya untuk memperluas jawaban @ DRAX , saya akan melakukan ini:
Ini akan memperhitungkan juga untuk
null
s danundefined
tipe, dan itu akan menangani tipe non-string, seperti0
.sumber
Ini cukup baik untukku.
PERINGATAN: Ini bukan solusi yang sempurna. Lihat bagian bawah posting saya.
Dan Anda bisa menggunakan ini seperti di bawah ini.
PERINGATAN: Ini berfungsi salah dalam hal:
sumber
Anda dapat menggunakan fungsi ini untuk menentukan jenis apa pun:
Untuk memeriksa apakah suatu variabel adalah string:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
sumber
Saya tidak yakin apakah maksud Anda mengetahui apakah itu tipe
string
terlepas dari isinya, atau apakah isinya angka atau string, terlepas dari jenisnya.Jadi untuk mengetahui apakah tipenya adalah string, itu sudah dijawab.
Tetapi untuk mengetahui berdasarkan isinya jika berupa string atau angka, saya akan menggunakan ini:
Dan untuk beberapa contoh:
sumber
/^\d+$/.test('123')
untuk menghindari seluk-beluk masalah parsing potensial)