Javascript! Ví dụ nếu tuyên bố


186

Đâ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 có cách nào để làm một cái gì đó như thế này:

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

Chìa khóa ở đây 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 này là như thế này:

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

Và hơi khó chịu khi phải tạo một câu lệnh khác khi tôi chỉ muốn biết liệu đối tượng có phải là một loại cụ thể không.

Câu trả lời:


354

Gửi trong ngoặc đơn và phủ định ở bên ngoài.

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

Trong trường hợp này, thứ tự ưu tiên rất quan trọng ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Các ! toán tử đi trước toán tử instanceof.


9
@ hrishikeshp19 - Tôi khá chắc chắn rằng bạn cần parens, tôi chỉ thử điều đó trong chrome, IE và nút và mỗi máy chủ cần chúng.
Marcus Pope

1
@ riship89 parens là bắt buộc, bằng chứng: !! obj instanceof Arraytrả về false (không chính xác) trong khi !!(obj instanceof Array)trả về true (chính xác)
zamnuts

10
Lý do là! Obj được đánh giá đầu tiên trong if (! Obj instanceof Array), đánh giá là true (hoặc false), sau đó trở thành if (bool instanceof Array), rõ ràng là sai. Do đó, bọc nó trong ngoặc đơn như đề xuất.
ronnbot

1
Lý do này thực sự nên là một phần của câu trả lời, nếu không thì câu trả lời này không tốt hơn câu trả lời của Chris dưới đây. @SergioTulentsev, bạn sẽ thật tử tế và thêm một cái gì đó như thế này: In this case, the order of precedence is important (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). The ! operator precedes the instanceof operator. vào câu trả lời của bạn?
dùng0800

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

Là cách chính xác để kiểm tra điều 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à nên được hiểu ...

Trong trường hợp của !toán tử không có dấu ngoặc.

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

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

Trong trường hợp của người !vận hành trước người instanceofvận hành.

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

Đây là một lỗi cú pháp. Các toán tử như !=là một toán tử đơn lẻ, trái ngược với KHÔNG được áp dụng cho THIẾT BỊ. Không có toán tử !instanceofnào giống như không có !<toán tử.


Lưu ý Tôi đã có thể đư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

5
Chỉ những câu trả lời giải thích lý do tại sao một vấn đề (như vấn đề này) mới được chấp nhận ...
Robert Rossmann

@chrismichaelscott Theo ý kiến ​​của tôi, và tôi chắc chắn rằng tôi không cô đơn, một câu trả lời như của bạn là điều mà bất cứ ai muốn hỏi một câu hỏi ở đây. Rõ ràng, đến thời điểm 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à nên là câu trả lời được chấp nhận.
cram2208

42

Thật dễ dàng để quên dấu ngoặc đơn (ngoặc) để bạn có thể tạo thói quen làm:

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

hoặc là

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

Hãy thử nó ở đây


7
Nó thực sự trông sạch hơn so với phủ định đối với tôi.
Kamil Latosinski
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.