2011-11-09 27 views
8

Dưới đây là một đoạn mã JavaScript từ một hướng dẫn mà tôi đang làm việc. Tôi không hiểu tại sao nó không kết thúc với điều khoản else cuối cùng; Tôi nghĩ đó là một quy tắc.Tại sao Javascript sẽ `if ... else if` không kết thúc bằng` else`?

var curScene = 0; 

function changeScene(decision) { 
    var message = ""; 

    if(curScene == 1) { 
    message = " welcome"; 
    } else if (curScene == 2) { 
    message = " this is scene two"; 
    } else if (curScene == 3) { 
    message = " this is scene three"; 
    } 

    document.getElementById("sceneimg").src = "scene" + curScene + ".png"; 

    if(message != ""){ 
    alert(message); 
    } 
} 
+1

Không bắt buộc phải có người khác nếu có. –

+0

Theo hiểu biết của tôi, không cần phải có người khác bằng bất kỳ ngôn ngữ nào. Nếu không có gì đặc biệt mà bạn muốn làm khi điều kiện if là sai, thì cũng không có nhu cầu hợp lý cho nó. Nó sẽ là một khối trống. – Toast

+0

'else' là một từ khóa tùy chọn trong khối' if/else'. Và, có thể, rằng một logic của mã hướng dẫn của bạn không yêu cầu 'else' –

Trả lời

5

Đối với lý do tương tự như lý do tại sao bạn có thể chỉ có một duy nhất nếu:

if(/*condition*/) { 
    //some code 
} 

//other stuff 
-2

có, luôn luôn có một khácVERY GOOD thói quen (khi sử dụng với if-elseif) . đôi khi mọi người thậm chí có thể viết điều này:

if(curScene == 1) { 
    message =" welcome"; 
else if (curScene == 2) { 
    message = " this is scene two"; 
} 
else if (curScene == 3) { 
    message = " this is scene three"; 
} else { 
    // empty. 
} 

để nói với mọi người rằng thực sự không có gì để làm ở người khác.

+0

nhưng ** không ** được yêu cầu (và đó là câu hỏi) – Aziz

+0

có, về mặt kỹ thuật, nó là tùy chọn. –

+4

Bạn có thể giải thích tại sao bạn nghĩ đó là một thói quen tốt? Tôi không thể nghĩ ra bất kỳ vấn đề phổ biến nào mà nó bắt được. –

12

Tôi nghĩ rằng nó luôn luôn phải kết thúc bằng "khác"?

Bạn bị nhầm lẫn. Khối else là tùy chọn. Bạn có thể có if mà không cần else.

+0

Đó là những gì tôi đã tìm, nhưng tôi chưa thấy bất kỳ tài liệu chính thức nào. Ngay cả [tài liệu của MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else) luôn có mệnh đề cuối cùng khác. Bạn có thể cung cấp một số tài liệu tham khảo? – chharvey

2

Nó không phải, vì lý do tương tự, một số if không yêu cầu else.

Thông thường đó là một ý tưởng tốt để có một, như một loại "nhận tất cả" tình hình, nhưng các mã trên có thể được viết như sau:

switch(curScene) { 
    case 1: message = " welcome"; break; 
    case 2: message = " this is scene two"; break; 
    case 3: message = " this is scene three"; break; 
} 

Trong đoạn mã trên, tôi cũng có thể thêm:

default: message = " invalid curScene value"; break; 

Nhưng hoàn toàn tùy chọn để làm như vậy. Nó phụ thuộc vào độ tin cậy của biến số curScene là liệu cá nhân tôi có thêm nó vào hay không.

+0

Không cần thiết gấp đôi kể từ khi câu lệnh 'break' cuối cùng được khuyến khích, nhưng hoàn toàn không có mục đích. – puk

0

elsedefault case cho tuyên bố if. Nếu không có else thì nếu không có điều kiện nào trong các trường hợp if hoặc else if được đáp ứng hơn số if thì sẽ không làm gì cả.

Thông thường, thực hành tốt là có trường hợp mặc định nhưng có rất nhiều lần không cần thiết và do đó bị loại trừ khỏi mã.

Trong trường hợp này, nếu curScene là bất cứ điều gì khác hơn là 1, 2, 3 thì else Statment sẽ được sử dụng, nhưng vì không có xử lý được thực hiện trên các trường hợp khác các coder chưa bao gồm một else.

2

Hãy xem xét 3 Kịch bản
Kịch bản 1:điều kiện Boolean

if (condition) {} 
else {} 

Xác định một điều kiện như else if sẽ là không cần thiết, và nó thực sự rõ ràng để người đọc những gì các mã lệnh thực hiện. Không có đối số cho việc sử dụng khác nếu trong trường hợp này.

Kịch bản 2:bang Infinite

Ở đây chúng ta quan tâm đến việc kiểm tra các điều kiện A và B (và vân vân), và chúng ta có thể hoặc không có thể quan tâm đến những gì sẽ xảy ra nếu không ai trong số họ nắm giữ :

if (conditionA) {} 
else if (conditionB) {} 
else {} // this might be missing as it is in your case 

điểm quan trọng ở đây là có không phải là một số hữu hạn các trạng thái lẫn nhau độc quyền, ví dụ: conditionA có thể num % 2 == 0 và conditionB có thể num % 3 == 0.

Tôi nghĩ rằng việc sử dụng một lượng chi nhánh hợp lý ở đây là điều tự nhiên và mong muốn; nếu các chi nhánh trở nên quá nhiều điều này có thể là một dấu hiệu cho thấy một số sử dụng khôn ngoan của thiết kế OO sẽ dẫn đến những cải tiến bảo trì tuyệt vời.

Kịch bản 3:Finite states

Đây là mặt đất trung bình giữa hai trường hợp đầu tiên: số lượng của các quốc gia là hữu hạn nhưng nhiều hơn hai. Thử nghiệm cho các giá trị của một kiểu enum như là ví dụ điển hình:

if (var == CONSTANT_FOO) {} 
else if (var == CONSTANT_BAR) {} // either this, 
else {} // or this might be missing 

Trong trường hợp này sử dụng một công tắc có lẽ là tốt hơn bởi vì nó ngay lập tức liên lạc với người đọc rằng số lượng của các quốc gia là hữu hạn và đưa ra một gợi ý mạnh mẽ như trong danh sách tất cả các trạng thái có thể được tìm thấy (trong ví dụ này, các hằng số bắt đầu bằng CONSTANT_). Tiêu chí cá nhân của tôi là số lượng các trạng thái mà tôi đang thử nghiệm: nếu nó chỉ là một (nếu không), tôi sẽ sử dụng if; nếu không, một công tắc. Trong mọi trường hợp, tôi sẽ không viết khác nếu trong trường hợp này.

Thêm khác làm khối lỗi chặn trống

Điều này có liên quan trực tiếp đến kịch bản số 2 ở trên. Trừ khi các trạng thái có thể là hữu hạn và được biết đến tại thời gian biên dịch, bạn không thể nói rằng "trong bất kỳ trường hợp nào khác" có nghĩa là đã xảy ra lỗi. Nhìn thấy như trong kịch bản # 2 một chuyển đổi sẽ cảm thấy tự nhiên hơn, tôi cảm thấy rằng bằng cách sử dụng khác theo cách này có một mùi mã xấu.

Sử dụng công tắc có nhánh mặc định thay thế. Nó sẽ truyền đạt ý định của bạn rõ ràng hơn:

switch(direction) { 
    case 'up': break; 
    case 'down': break; 
    default: // put error handling here if you want 
} 

Điều này có thể tiết hơn một chút, nhưng nó rõ ràng đối với người đọc cách mã dự kiến ​​sẽ hoạt động. Theo tôi, một khối trống khác sẽ trông không tự nhiên và khó hiểu ở đây.

+0

Cảm ơn bạn Wazzy, điều này giải thích rất nhiều :-) – Starkemp315

+0

@ Starkemp315 Tại sao tôi được bầu -1 rồi ... Thất vọng ... – Wazzzy

+0

@ Starkemp315 Vui lòng chấp nhận câu trả lời nếu bạn nghĩ nó giải thích cho bạn rất nhiều – Wazzzy

-4

thay đổi nếu điều kiện để xác nhận câu trả lời if (câu trả lời == 100) để if (câu trả lời === 100) nó đang làm việc tốt bây giờ ...

+1

Chào mừng bạn đến với [so]. Trong trường hợp này, mã được cung cấp hoạt động hoàn toàn tốt - người hỏi chỉ hỏi tại sao 'else' * not * cần thiết trong ví dụ đó. –

0

Không có một điều khoản khác là tốt cú pháp. MDN Documentation Về cơ bản thứ hai nếu trở thành cơ thể của người khác, hãy xem phần "làm thế nào nó sẽ trông giống như nếu tổ được thụt vào đúng".

Việc thực hành không tốt, tôi nghĩ điều đó phụ thuộc vào mục đích. Bằng cách không xác định rõ ràng mệnh đề cuối cùng khác, bạn có thể kết thúc bằng một lỗi trong đó một điều kiện mà bạn không đề cập đến. Hãy xem xét điều này:

if(myVariable > 0) { 
    doSomething(); 
} else if(myVariable < 0) { 
    doSomethingElse(); 
} 

Không có gì xảy ra nếu myVariable là 0. Thật khó để xem bạn có lướt qua mã không.Tôi sẽ nói nếu bạn chạy vào mẫu này nó sẽ là một mùi mã, một cái gì đó có thể sai, nhưng nó có thể là tốt.

Cùng một logic luôn có thể được thể hiện bằng lồng nhau nếu câu lệnh. Tôi sẽ đi với bất cứ điều gì là dễ đọc hơn.

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