2009-07-29 40 views
6

Nói rằng tôi có một chức năng như vậy:Cách tốt nhất để kiểm tra xem một đối tượng có phải là một mảng hay không trong Javascript?

function foo(bar) { 
    if (bar > 1) { 
     return [1,2,3]; 
    } else { 
     return 1; 
    } 
} 

Và nói tôi gọi foo(1), làm thế nào để tôi biết nó sẽ trả về một mảng hay không?

+2

Bạn đang làm cho cuộc sống của mình khó khăn hơn mức cần thiết. Tôi sẽ xem xét nó phong cách tốt hơn nếu chức năng luôn luôn trả về một mảng. – Miles

Trả lời

16

tôi sử dụng chức năng này:

function isArray(obj) { 
    return Object.prototype.toString.call(obj) === '[object Array]'; 
} 

có phải là cách mà jQuery.isArray được thực hiện.

Kiểm tra bài viết này:

+0

Hoàn hảo! Tôi đang sử dụng jQuery vì vậy tôi sẽ chỉ sử dụng nó. Bài viết cũng đã giúp. – Artilheiro

+0

trong các trình duyệt hiện đại, chúng ta có hàm Array.isArray, tốt hơn nên viết smth như if! Array.isArray {... ở đây đi định nghĩa ...} – shabunc

3
if(foo(1) instanceof Array) 
    // You have an Array 
else 
    // You don't 

Cập nhật: tôi phải đối phó với những ý kiến ​​làm dưới đây, bởi vì mọi người vẫn đang khẳng định rằng điều này sẽ không làm việc mà không cố gắng nó cho bản thân ...

Đối với một số đối tượng khác kỹ thuật này không hoạt động (ví dụ "" instanceof String == false), nhưng điều này làm việc cho Array. Tôi đã thử nghiệm nó trong IE6, IE8, FF, Chrome và Safari. Hãy thử và tự mình xem trước khi bình luận bên dưới.

+1

xem https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/instanceof_Operator – VolkerK

+5

Điều đó sẽ * chỉ * hoạt động, nếu bạn khai báo một mảng thông qua 'new Array()', không phải với '[] 'viết tắt. Xem phần 'Mô tả' bên dưới URL ở trên. – Boldewyn

+0

bài đăng chi tiết về cách sử dụng phương pháp này: http://thinkweb2.com/projects/prototype/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ – CMS

-1

Để thực hiện giải pháp của bạn tổng quát hơn, bạn có thể không quan tâm cho dù đó thực sự là một đối tượng Array. Ví dụ, document.getElementsByName() trả về một đối tượng "hoạt động như" một mảng. "Tuân thủ mảng" có thể được giả định nếu đối tượng có thuộc tính "chiều dài".

function is_array_compliant(obj){ 
    return obj && typeof obj.length != 'undefined'; 
} 
+0

Các chuỗi có một thuộc tính "length". –

+0

Đó là sự thật. Vì vậy, bạn cũng nên kiểm tra xem: typeof obj == "object" – dankuck

2

Dưới đây là một cách rất đáng tin cậy, hãy từ javascript: những phần tốt, xuất bản bởi O'Reilly:

if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' && 
!(my_value.propertyIsEnumerable('length')) { // my_value is truly an array! } 

tôi sẽ đề nghị gói nó trong chức năng của riêng bạn:

function isarray(my_value) { 

    if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' && 
     !(my_value.propertyIsEnumerable('length')) 
     { return true; } 
    else { return false; } 
} 
+0

Bạn chỉ có thể 'trả về' kết quả của biểu thức thay vì' if..else'. : P –

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