Làm cách nào để kiểm tra xem var có phải là một chuỗi trong JavaScript không?


Câu trả lời:


381

Bạn đã gần:

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

Trên một lưu ý liên quan: kiểm tra ở trên sẽ không hoạt động nếu một chuỗi được tạo với new String('hello')kiểu như sẽ Objectthay thế. Có nhiều giải pháp phức tạp để giải quyết vấn đề này, nhưng tốt hơn hết là tránh tạo chuỗi theo cách đó, bao giờ hết.


1
Các bạn, tôi thực sự sẽ đưa ra một câu trả lời được chấp nhận cho cả hai bạn, nhưng tôi không thể, tất cả những gì tôi có thể làm là +1 cho cả hai, hơn là đưa ra câu trả lời được chấp nhận ở những người gần gũi hơn với vấn đề cụ thể của tôi, rằng tôi không giải thích đầy đủ
vitto

cái này hiệu quả với tôiif(typeof(str) === typeof(String()))
Scott Murphy

78

Các typeofnhà điều hành không phải là một trung tố (vì vậy LHS ví dụ của bạn không có ý nghĩa).

Bạn cần sử dụng nó như vậy ...

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

Hãy nhớ rằng, typeoflà một toán tử, không phải là một chức năng. Mặc dù vậy, bạn sẽ thấy typeof(var)được sử dụng rất nhiều trong tự nhiên. Điều này làm cho nhiều ý nghĩa như var a = 4 + (1).

Ngoài ra, bạn cũng có thể sử dụng ==(toán tử so sánh đẳng thức) vì cả hai toán hạng là Strings ( typeof luôn trả về a String), JavaScript được định nghĩa để thực hiện các bước tương tự tôi đã sử dụng ===(toán tử so sánh nghiêm ngặt).

Như Box9 đề cập , điều này sẽ không phát hiện ra một Stringđối tượng được khởi tạo .

Bạn có thể phát hiện cho điều đó với ....

var isString = str instanceof String;

jsFiddle .

...hoặc là...

var isString = str.constructor == String;

jsFiddle .

Nhưng điều này sẽ không hoạt động trong một windowmôi trường đa (nghĩ iframe).

Bạn có thể giải quyết vấn đề này với ...

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

jsFiddle .

Nhưng một lần nữa, (như Box9 đề cập ), tốt hơn hết là bạn chỉ nên sử dụng Stringđịnh dạng theo nghĩa đen , vd var str = 'I am a string';.

Đọc thêm .


1
@ Box9 Đừng lo lắng, dù sao tôi cũng bị giới hạn: P
alex

@alex Bây giờ tôi cũng vậy: o (10 phút nữa!)
David Tang

3
@RobG Rep giới hạn là khi bạn đã đạt được đại diện tối đa trong một khoảng thời gian 24 giờ. Sau đó, upvote không được tính vào danh tiếng của bạn.
alex

Có phải không thể kiểm tra xem một biến có phải là một chuỗi hay không bằng cách kiểm tra sự hiện diện của một thành viên mà chỉ các chuỗi có? Ví dụ : if(myVar.toUpperCase) alert('I am a string');? Xem: jsfiddle.net/tb3t4nsx
thành

1
@ thành phần_15939 nó không thực sự là một cách tốt ... bởi vì{ toUpperCase: '' }
alex

14

Kết hợp các câu trả lời trước cung cấp các giải pháp sau:

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

hoặc là

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

4

Biểu thức sau trả về true :

'qwe'.constructor === String

Biểu thức sau trả về true :

typeof 'qwe' === 'string'

Biểu thức sau trả về false (sic!):

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

Biểu thức sau trả về true :

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

Cách tốt nhất và đúng ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

Ngày nay tôi tin rằng nên sử dụng một dạng hàm của typeof () vì vậy ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

không có dạng hàm typeof, bạn chỉ kiểm soát thứ tự các thao tác với các dấu ngoặc đơn đó. Một số người có thể thấy nó dễ đọc hơn trong một số trường hợp.
Jon z

@Jonz Ý của bạn là gì khi "kiểm soát thứ tự hoạt động"? Cảm ơn.
a20

Tôi nghĩ sau này tôi nhận ra bạn có thể kiểm tra hàm tạo và thích nó vì theo lý thuyết tôi nghĩ sẽ nhanh hơn nhưng nó không nhanh hơn? Ví dụ số 4 ở đây hiển thị các dấu ngoặc đơn sử dụng developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... nó chắc chắn hơn có thể đọc được và ít hơn cho một trình biên dịch phân tích cú pháp để xem xét. Tôi đoán về 'thứ tự' có thể là vấn đề tốc độ hoặc liên quan đến cách trình biên dịch tải ngăn xếp đối số, tôi không chắc chắn.
Master James

1
@ a20 thứ tự các hoạt động mô tả thứ tự các hoạt động được thực thi cho các câu lệnh có chứa nhiều hoạt động. Xem developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ mẹo - dấu ngoặc đơn (Nhóm hoạt động) có quyền ưu tiên toán tử cao nhất và do đó được đánh giá đầu tiên. Trong trường hợp này, các dấu ngoặc đơn xung quanh filenamechỉ nhóm một câu lệnh duy nhất và do đó vô dụng và không liên quan. Thật tốt khi câu trả lời này có điểm 0 vì nó sai, gây hiểu lầm và không có ích; sẽ tốt hơn nếu nó có điểm âm.
Jon z

Rất nhiều thông tin cảm ơn cho các liên kết. Vậy dấu ngoặc đơn được kiểm tra & chạy trước? Vì vậy, nên chạy ngay mà không cần kiểm tra tiếp theo cho các cách gọi aka khác mà không có dấu ngoặc đơn, đó sẽ là các bước sau và chậm hơn? Không? những gì tôi không hiểu về trình biên dịch thời gian chạy ở đó.
Thầy James

0

kiểm tra null hoặc không xác định trong mọi trường hợp a_ chuỗi

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nulltypeof undefinedsẽ không bao giờ trở lại 'string', như vậy typeof a_stringlà đủ. Xin lỗi vì đã hoại tử
Ivan Frolov

-3

Cách tiếp cận cá nhân của tôi, dường như hoạt động cho tất cả các trường hợp, đang thử nghiệm sự hiện diện của các thành viên mà tất cả sẽ chỉ có mặt cho chuỗi.

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

Xem: http://jsfiddle.net/x75uy0o6/

Tôi muốn biết liệu phương pháp này có sai sót hay không, nhưng nó đã phục vụ tốt cho tôi trong nhiều năm.


2
Điều này dễ bị đánh lừa bởi bất kỳ đối tượng cũ nào có các phương thức đó.
alex

8
Điều này được gọi là gõ vịt - ví dụ nếu nó đi như một chuỗi và nó nói như một chuỗi, nó cũng có thể là một chuỗi. Bạn hơi điên nếu bạn nghĩ rằng đây là cách tốt nhất để kiểm tra một chuỗi, nhưng Javascript là Thunderdome, bạn làm bạn.
Jon z
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.