2012-01-16 34 views
107

Đây là một câu hỏi thực sự cơ bản thực sự chỉ để thỏa mãn sự tò mò của tôi, nhưng là có một cách để làm một cái gì đó như thế này:Javascript instanceof Nếu Bản Tuyên Bố

if(obj !instanceof Array) { 
    //The object is not an instance of Array 
} else { 
    //The object is an instance of Array 
} 

Mấu chốt ở đây là có thể sử dụng KHÔNG! trước mặt. Thông thường, cách tôi phải thiết lập điều này là như sau:

if(obj instanceof Array) { 
    //Do nothing here 
} else { 
    //The object is not an instance of Array 
    //Perform actions! 
} 

Và một chút phiền toái khi phải tạo một tuyên bố khác khi tôi chỉ muốn biết đối tượng là một loại cụ thể.

Trả lời

236

Kèm theo dấu ngoặc đơn và phủ nhận ở bên ngoài.

if(!(obj instanceof Array)) { 
    //... 
} 
+8

@ hrishikeshp19 - Tôi khá chắc chắn bạn cần parens, tôi chỉ cố gắng rằng trong chrome, IE và nút và mỗi máy chủ cần chúng. –

+0

@ riship89 parens là bắt buộc, bằng chứng: '' !! obj instanceof Array'' trả về false (sai) trong khi '' !! (obj instanceof Array) '' trả về true (đúng) – zamnuts

+8

Lý do là obj được đánh giá đầu tiên trong if (! obj instanceof Array), đánh giá true (hoặc false), mà sau đó sẽ trở thành nếu (bool instanceof Array), mà rõ ràng là sai. Do đó, quấn nó trong dấu ngoặc đơn như được gợi ý. – ronnbot

57
if (!(obj instanceof Array)) { 
    // do something 
} 

có phải là cách đúng để kiểm tra này - như những người khác đã trả lời. Hai chiến thuật khác đã được đề xuất sẽ không hoạt động và cần được hiểu ...

Trong trường hợp nhà điều hành ! không có dấu ngoặc đơn.

if (!obj instanceof Array) { 
    // do something 
} 

Trong trường hợp này, thứ tự ưu tiên là quan trọng (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). Toán tử ! đứng trước toán tử instanceof. Vì vậy, !obj được đánh giá là false trước tiên (tương đương với ! Boolean(obj)); thì bạn đang thử nghiệm xem false instanceof Array, điều này rõ ràng là tiêu cực.

Trong trường hợp của toán tử ! trước toán tử instanceof.

if (obj !instanceof Array) { 
    // do something 
} 

Đây là lỗi cú pháp. Các toán tử như != là một toán tử đơn, trái với một NOT được áp dụng cho một EQUALS. Không có toán tử nào như !instanceof giống như cách không có toán tử !<.

+0

NB. Tôi đã đưa ra nhận xét này về câu trả lời của Sergio vì điều đó rõ ràng là đúng nhưng tôi không phải là thành viên của SO nên không có đủ điểm danh tiếng để bình luận. – chrismichaelscott

+4

Chỉ có câu trả lời giải thích ** tại sao ** của một vấn đề (như thế này) nên được chấp nhận ... –

+0

@chrismichaelscott Theo tôi, và tôi chắc chắn tôi không đơn độc, câu trả lời giống như của bạn là điều được mong đợi nhất bất cứ ai đặt câu hỏi ở đây.Rõ ràng, đến mức này, và chia sẻ đủ thông tin và ví dụ để giải quyết vấn đề được trình bày. Cảm ơn rất nhiều. Và tôi nghĩ bạn xứng đáng với danh tiếng và đáng lẽ phải là câu trả lời được chấp nhận. – cram2208

18

Nó rất dễ dàng để quên dấu ngoặc đơn (ngoặc) để bạn có thể tạo một thói quen thực hiện:

if(obj instanceof Array === false) { 
    //The object is not an instance of Array 
} 

hoặc

if(false === obj instanceof Array) { 
    //The object is not an instance of Array 
} 

Thử here

+0

Nó thực sự trông sạch hơn phủ định đối với tôi. –

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