Làm cách nào để kiểm tra xem var có phải là một chuỗi trong JavaScript không?
Tôi đã thử điều này và nó không hoạt động ...
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string') {
// this is a string
}
Làm cách nào để kiểm tra xem var có phải là một chuỗi trong JavaScript không?
Tôi đã thử điều này và nó không hoạt động ...
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string') {
// this is a string
}
Câu trả lời:
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ẽ Object
thay 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.
if(typeof(str) === typeof(String()))
Các typeof
nhà đ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, typeof
là 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à String
s ( 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 window
mô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 .
if(myVar.toUpperCase) alert('I am a string');
? Xem: jsfiddle.net/tb3t4nsx
{ toUpperCase: '' }
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) {
...
}
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;
}
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.
filename
chỉ 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.
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 null
và typeof undefined
sẽ không bao giờ trở lại 'string'
, như vậy typeof a_string
là đủ. Xin lỗi vì đã hoại tử
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.