Bagaimana saya bisa memeriksa apakah var adalah string dalam JavaScript?

Jawaban:

381

Anda sudah dekat:

if (typeof a_string === 'string') {
    // this is a string
}

Pada catatan terkait: centang di atas tidak akan berfungsi jika string dibuat dengan new String('hello')jenis yang akan digunakan Object. Ada solusi rumit untuk mengatasi hal ini, tetapi lebih baik untuk menghindari menciptakan string seperti itu, selamanya.

David Tang
sumber
1
Guys, saya benar-benar akan memberikan jawaban yang diterima untuk Anda berdua, tetapi saya tidak bisa, yang bisa saya lakukan adalah memberi +1 pada keduanya, daripada memberikan jawaban yang diterima pada siapa yang lebih dekat dengan masalah spesifik saya, bahwa saya tidak sepenuhnya dijelaskan.
vitto
ini berhasil untuk sayaif(typeof(str) === typeof(String()))
Scott Murphy
78

The typeofOperator bukanlah infiks (sehingga LHS dari contoh Anda tidak masuk akal).

Anda harus menggunakannya seperti itu ...

if (typeof a_string == 'string') {
    // This is a string.
}

Ingat, typeofadalah operator, bukan fungsi. Meskipun demikian, Anda akan melihat typeof(var)banyak digunakan di alam liar. Ini masuk akal seperti var a = 4 + (1).

Juga, Anda juga dapat menggunakan ==(operator perbandingan kesetaraan) karena kedua operan adalah Strings ( typeof selalu mengembalikan a String), JavaScript didefinisikan untuk melakukan langkah-langkah yang sama seperti yang saya gunakan ===(operator perbandingan ketat).

Seperti Box9 menyebutkan , ini tidak akan mendeteksiString objek yang dipakai .

Anda dapat mendeteksi untuk itu dengan ....

var isString = str instanceof String;

jsFiddle .

...atau...

var isString = str.constructor == String;

jsFiddle .

Tetapi ini tidak akan bekerja di windowlingkungan multi (pikirkan iframes).

Anda dapat menyiasati ini dengan ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle .

Tetapi sekali lagi, (seperti Box9 menyebutkan ), Anda lebih baik hanya menggunakan Stringformat literal , misalnya var str = 'I am a string';.

Bacaan lebih lanjut .

alex
sumber
1
@ Box9 Jangan khawatir, toh saya masih capped: P
alex
@ alex Saya sekarang juga: o (10 menit lagi!)
David Tang
3
@RobG Rep capped adalah ketika Anda telah mendapatkan rep maksimum selama satu periode 24 jam. Setelah itu, upvotes tidak masuk dalam reputasi Anda.
alex
Apakah tidak mungkin untuk memeriksa apakah suatu variabel adalah string dengan hanya menguji keberadaan anggota yang hanya dimiliki string? Sebagai contoh: if(myVar.toUpperCase) alert('I am a string');? Lihat: jsfiddle.net/tb3t4nsx
ingredient_15939
1
@brabent_15939 itu tidak benar-benar cara yang baik ... karena{ toUpperCase: '' }
alex
14

Menggabungkan jawaban sebelumnya memberikan solusi ini:

if (typeof str == 'string' || str instanceof String)

atau

Object.prototype.toString.call(str) == '[object String]'
Alf Eaton
sumber
4

Ekspresi berikut mengembalikan true :

'qwe'.constructor === String

Ekspresi berikut mengembalikan true :

typeof 'qwe' === 'string'

Ekspresi berikut menghasilkan false (sic!):

typeof new String('qwe') === 'string'

Ekspresi berikut mengembalikan true :

typeof new String('qwe').valueOf() === 'string'

Cara terbaik dan benar ( imho ):

if (someVariable.constructor === String) {
   ...
}
redisko
sumber
1

Sekarang saya percaya ini lebih disukai untuk menggunakan bentuk fungsi typeof () jadi ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}
Tuan James
sumber
tidak ada bentuk fungsi typeof, Anda hanya mengendalikan urutan operasi dengan tanda kurung itu. Beberapa orang mungkin merasa lebih mudah dibaca dalam keadaan tertentu.
Jon z
@ Jonz Apa yang Anda maksud dengan "mengendalikan urutan operasi"? Terima kasih.
20
Saya pikir kemudian saya menyadari Anda dapat memeriksa konstruktor dan lebih suka karena secara teori saya pikir akan lebih cepat tetapi tidak lebih cepat? Contoh nomor 4 di sini menunjukkan penggunaan kurung developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… itu pasti lebih mudah dibaca dan lebih sedikit untuk dipertimbangkan oleh kompiler untuk diurai. Dugaan saya pada 'pesanan' mungkin masalah kecepatan atau terkait dengan bagaimana kompiler memuat tumpukan argumen, saya tidak yakin.
Tuan James
1
@ a20 urutan operasi menjelaskan urutan operasi yang dijalankan untuk pernyataan yang berisi beberapa operasi. Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - tanda kurung (Pengelompokan operasi) memiliki prioritas operator tertinggi dan karenanya dievaluasi terlebih dahulu. Dalam hal ini, tanda kurung di sekitar filenamegrup hanya satu pernyataan, dan karena itu tidak berguna dan asing. Untung jawaban ini memiliki skor 0 karena salah, menyesatkan, dan tidak membantu; akan lebih baik jika memiliki skor negatif.
Jon z
Terima kasih banyak atas informasinya. Jadi tanda kurung diperiksa & dijalankan dulu? jadi itu harus segera dijalankan tanpa memeriksa selanjutnya untuk cara lain memanggil alias tanpa tanda kurung, yang akan menjadi langkah kemudian dan lebih lambat? tidak? apa yang saya tidak mengerti tentang kompiler runtime di sana.
Tuan James
0

periksa null atau tidak terdefinisi dalam semua kasus a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}
Kurkula
sumber
typeof nulldan typeof undefinedtidak akan pernah kembali 'string', itu typeof a_stringsudah cukup. Maaf untuk necroposting
Ivan Frolov
-3

Pendekatan pribadi saya, yang tampaknya bekerja untuk semua kasus, sedang menguji kehadiran anggota yang semuanya hanya akan hadir untuk string.

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

Lihat: http://jsfiddle.net/x75uy0o6/

Saya ingin tahu apakah metode ini memiliki kekurangan, tetapi telah membantu saya selama bertahun-tahun.

bahan_15939
sumber
2
Ini mudah dibodohi oleh objek lama yang memiliki metode tersebut.
alex
8
Ini disebut bebek-mengetik - misalnya jika berjalan seperti tali dan berbicara seperti tali, itu mungkin juga berupa tali. Anda sedikit gila jika Anda berpikir ini adalah cara terbaik untuk menguji string, tetapi Javascript adalah Thunderdome, Anda melakukannya.
Jon z