Trong JavaScript, việc trả lại câu lệnh chuyển đổi có được coi là cách thực hành tốt hơn so với sử dụng break không?


198

Tùy chọn 1 - chuyển đổi sử dụng return:

function myFunction(opt) 
{
    switch (opt) 
    {
        case 1: return "One";
        case 2: return "Two";
        case 3: return "Three";

        default: return "";
    }    
}

Tùy chọn 2 - chuyển đổi bằng cách sử dụng break:

function myFunction(opt) 
{
    var retVal = "";

    switch (opt) 
    {
        case 1: 
            retVal = "One";
            break;

        case 2: 
            retVal = "Two";
            break;

        case 3: 
            retVal = "Three";
            break;
    }

    return retVal;
}

Tôi biết rằng cả hai công việc, nhưng là một trong những thực hành tốt nhất? Tôi có xu hướng thích Tùy chọn 1 - chuyển đổi bằng cách sử dụng return tốt nhất, vì nó sạch hơn và đơn giản hơn.


Dưới đây là một jsFiddle về ví dụ cụ thể của tôi bằng cách sử dụng kỹ thuật được đề cập trong các nhận xét của @ ic3b3rg :

var SFAIC = {};

SFAIC.common = 
{
    masterPages: 
    {
        cs: "CS_",
        cp: "CP_"
    },

    contentPages: 
    {
        cs: "CSContent_",
        cp: "CPContent_"    
    }
};

function getElementPrefix(page) 
{
    return (page in SFAIC.common.masterPages)
        ? SFAIC.common.masterPages[page]
        : (page in SFAIC.common.contentPages)
            ? SFAIC.common.contentPages[page]
            : undefined;
}

Để gọi hàm, tôi sẽ làm như vậy theo các cách sau:

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);

Vấn đề ở đây là nó luôn trả về không xác định. Tôi đoán rằng đó là vì nó vượt qua giá trị thực của đối tượng theo nghĩa đen chứ không phải thuộc tính. Tôi sẽ làm gì để khắc phục điều này bằng cách sử dụng kỹ thuật được mô tả trong nhận xét của @ ic3b3rg ?


4
+1 Câu hỏi hay. Tôi đã tự hỏi điều này và trong khi tôi biết nó hoạt động để trở lại, tôi không biết liệu đó có phải là cách thực hành tốt nhất hay không. Tò mò muốn xem những gì cộng đồng nghĩ.
Eli

Câu trả lời:


266

Một ngắt sẽ cho phép bạn tiếp tục xử lý trong chức năng. Chỉ cần quay trở lại khỏi công tắc là ổn nếu đó là tất cả những gì bạn muốn làm trong chức năng.


6
Vì vậy, đưa ra ví dụ trong câu hỏi của tôi, câu trả lời là có. Nhưng, nếu bạn có một chức năng mà bạn cần tiếp tục, rõ ràng nghỉ sẽ là những gì bạn sẽ sử dụng.
Mã Maverick

9
Câu trả lời của @Mark Costello khiến tôi cảm ơn thêm một chút về câu hỏi của bạn. Tôi nghĩ rằng bạn đang tìm kiếm một hướng dẫn "thực hành tốt nhất" chung, nhưng trong ví dụ cụ thể bạn đã đưa ra, thực tiễn tốt nhất là return {1:"One",2:"Two,3:"Three"}[opt];. Nếu bạn cần mặc định thì nó sẽ làvar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg

@ ic3b3rg - Tôi đã chỉnh sửa câu hỏi của mình với ví dụ cụ thể của mình khi cố gắng sử dụng kỹ thuật của bạn return (opt in o) ? o[opt] : "";, nhưng nó luôn trả về mặc định trong trường hợp cụ thể của tôi.
Mã Maverick

Có một lỗi đánh máy trong mã của tôi (thiếu thứ 2 "in "Two") nhưng nó hoạt động với tôi ... đây là một thử nghiệm đơn giản:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

Tôi đã không sử dụng ví dụ của bạn, chỉ là kỹ thuật. Nhìn vào câu hỏi của tôi và nhấp vào liên kết đến jsFiddle của tôi để xem những gì tôi đang nói.
Mã Maverick

9

Nó phụ thuộc, nếu chức năng của bạn chỉ bao gồm câu lệnh switch, thì tôi nghĩ rằng nó ổn. Tuy nhiên, nếu bạn muốn thực hiện bất kỳ hoạt động nào khác trong chức năng đó, có lẽ đó không phải là một ý tưởng tuyệt vời. Bạn cũng có thể phải xem xét các yêu cầu của bạn ngay bây giờ so với trong tương lai. Nếu bạn muốn thay đổi chức năng của mình từ tùy chọn một sang tùy chọn hai, sẽ cần thêm cấu trúc lại.

Tuy nhiên, do trong câu lệnh if / other, cách tốt nhất là thực hiện như sau:

var foo = "bar";

if(foo == "bar") {
    return 0;
}
else {
    return 100;
}

Dựa trên điều này, đối số có thể được đưa ra là lựa chọn đó là thực tiễn tốt hơn.

Nói tóm lại, không có câu trả lời rõ ràng, miễn là mã của bạn tuân thủ một tiêu chuẩn nhất quán, dễ đọc, có thể duy trì - nghĩa là không trộn lẫn và kết hợp các tùy chọn một và hai trong suốt ứng dụng của bạn, đó là cách tốt nhất bạn nên làm tiếp theo.


2
Cách thực hành tốt nhất trong ví dụ đó làreturn foo == "bar";
ic3b3rg

10
Tôi xin lỗi nếu tôi làm phiền bạn nhưng trong trường hợp đó tôi vẫn đơn giản hóa: return foo == "bar" ? 0 : 100;hoặc thậm chí return [100,0][foo == "bar"];.
ic3b3rg

4
@ ic3b3rg - Không nên như vậy : return [100,0][+(foo == "bar")]; ?
Xếp hàng

3
@Queue Bạn đã đúng khi nói rằng boolean nên được chuyển đổi thành số nguyên, nhưng tôi sẽ làm theo cách này:return [100,0][foo == "bar" & 1];
ic3b3rg

7
@ ic3b3rg && Queue - Bạn muốn duy trì mã của ai đó bằng cách sử dụng các thủ thuật như vậy? (Tin tưởng trình biên dịch trước để tối ưu hóa tốc độ như thế)
T4NK3R
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.