2011-08-12 40 views
9

Tôi có một hàm javscript (thực sự là một jQuery plugin) mà tôi sẽ muốn gọi là một trong haiLàm thế nào để tôi biết sự khác biệt giữa đối tượng và chuỗi trong javascript?

myFunction("some input"); 

hoặc

myFunction({ "prop": "value 1", "prop2": "value2" }); 

Làm thế nào để, trong hàm, nói với hai ngoài?

Nói cách khác, điều gì sẽ xảy ra trong điều kiện if bên dưới?

if (/* the input is a string */) 
{ 
    // Handle string case (first of above) 
} 
else if (/* the input is an object */) 
{ 
    // Handle object case (second of above) 
} 
else 
{ 
    // Handle invalid input format 
} 

Tôi có jQuery theo ý của mình.

Cập nhật: Như đã đề cập trong một câu trả lời, nếu đầu vào là new String('some string'), typeof(input) sẽ trở lại 'object'. Làm cách nào để thử nghiệm cho new String(''), vì vậy tôi có thể xử lý theo cách tương tự như ''?

+0

Nếu đủ cho bạn, bạn có thể sử dụng 'jQuery.isPlainObject': http://api.jquery.com/jQuery.isPlainObject/ –

Trả lời

12

jQuery.type có thể thú vị cho bạn.

if($.type(input)==='string') 
{ 
    //it's a string 
} 
+0

Điều này dường như chăm sóc tất cả các lời nhắc được đề cập trong các câu trả lời khác, cho đến nay ít nhất. –

3

Nhà điều hành typeof có thể cung cấp cho bạn những gì bạn cần. ví dụ:

typeof(myobj) == 'string' 

(IIRC)

29
if(typeof input === 'string') { 
    // input is a string 
} 
else if(typeof input === 'object') { 
    // input is an object 
} 
else { 
    // input is something else 
} 

Lưu ý rằng typeof cũng cân nhắc mảng và null là các đối tượng:

typeof null === 'object' 
typeof [ 1, 2 ] === 'object' 

Nếu sự khác biệt rất quan trọng (bạn muốn chỉ "thực tế" đối tượng):

if(typeof input === 'string') { 
    // input is a string 
} 
else if(input && typeof input === 'object' && !(input instanceof Array)) { 
    // input is an object 
} 
else { 
    // input is something else 
} 
+0

+1 cho ghi chú về' đầu vào! = Null', mặc dù tôi ' m không chắc tôi phải quan tâm đến vụ này. 'Undefined' trả lại là gì? –

+0

'typeof doesntExist == 'undefined'', mặc dù bạn chỉ có thể thực hiện' if (input == undefined) ' – JJJ

+0

True - Tôi đã tạo ra các vòng tròn lạ trong đầu: P –

0

Trong javascript lệnh typeof trả về kiểu biến.

Tôi đã tạo một chút jsfiddle Dường như mảng cũng trả về typeof làm đối tượng.

0

Bạn có thể sử dụng chức năng typeof:

if (typeof(myvar) === 'string') { 
    // the code 
} 

thấy here để biết thêm thông tin

2

Bạn có thể;

function f(a) { print(typeof a) } 

f({"prop": "value 1", "prop2": "value2" }); 

>>object 

f("Some input"); 

>>string 
4

Như những người khác đã nói, toán tử typeof sẽ xác định loại biến.

Cẩn thận mặc dù:

var str = 'A String' ; 
var obj = new String(str) ; 
console.log(typeof str) ; 
console.log(typeof obj) ; 

// Outputs: 
// string 
// object 
+0

Cảm ơn bạn đã đứng đầu. Có cách nào để có được "chuỗi" từ 'chuỗi mới (str)' là tốt? –

+1

+1, cần phải tính đến các chuỗi được đóng hộp. Một cách để khắc phục điều này là kiểm tra phương thức bạn biết chỉ thuộc về chuỗi - ví dụ. 'if (some_var.substring! == undefined) {...}' –

+0

Hoặc 'x instanceof String' với báo trước của thừa kế nguyên mẫu –

0

Bạn muốn sử dụng $.type, vì đây là chính xác hơn typeof

$.fn.plugin = function(options) { 

    console.log($.type(options)); 

    if($.type(options) == 'string') { 
     // Handle string case (first of above) 
    } 
    else if($.type(options) == 'object' && options != null) { 
     // Handle object case (second of above) 
    } 
    else { 
     // Handle invalid input format 

    } 

}; 

$("#d1").plugin(new String('test')); //string 
$("#d1").plugin('test'); //string 
$("#d1").plugin({'key' : 'value'}); //object 

Demo here

Sửa

Ngoài ra nếu tùy chọn không được thiết lập sau đó !options sẽ đủ

Các vấn đề liên quan