2008-10-30 52 views
10

Tôi gặp sự cố trong một số JavaScript mà tôi đang viết nơi câu lệnh Chuyển đổi dường như không hoạt động như mong đợi.Tuyên bố chuyển đổi JavaScript

switch (msg.ResultType) { 
    case 0: 
    $('#txtConsole').val("Some Val 0"); 
    break; 
    case 1: 
    $('#txtConsole').val("Some Val 1"); 
    break; 
    case 2: 
    $('#txtConsole').text("Some Val 2"); 
    break; 
} 

ResultType là giá trị số nguyên 0-2 và tôi có thể thấy trong FireBug. Trong mọi trường hợp, công tắc chuyển điều khiển sang câu lệnh ngắt cuối cùng có nghĩa là tất cả logic được bỏ qua hoàn toàn. Tôi đang thiếu gì?

Trả lời

19

Tôi chắc chắn rằng một công tắc sử dụng === để so sánh trong Actionscript và kể từ JS và AS cả theo tiêu chuẩn ECMAScript, tôi đoán tương tự áp dụng cho JS. Tôi đoán là giá trị không thực sự là Số, nhưng có lẽ là một Chuỗi.

Bạn có thể thử sử dụng parseInt (msg.ResultType) trong chuyển đổi hoặc sử dụng chuỗi trong các trường hợp.

+8

LUÔN chỉ định tham số thứ hai để phân tích cú pháp! Đó là cơ số, vì vậy bạn sẽ muốn: parseInt (msg.ResultType, 10); Nếu bạn không cung cấp nó, nó sẽ cố gắng đoán các cơ số và những điều khủng khiếp sẽ xảy ra. – rmeador

+0

Vâng, những điều khủng khiếp sẽ chỉ xảy ra nếu bạn vượt qua một cái gì đó như 077, mà sẽ được hiểu là bát phân (nhưng không có 078, ví dụ), hoặc 0x10, nhưng trong trường hợp thứ hai nó khá rõ ràng rằng bạn có cơ sở 16. Dù sao, thêm các radix rõ ràng sẽ không làm tổn thương, vì vậy nó không phải là một ý tưởng tồi. –

+0

Trong trường hợp này thì không cần thiết, mặc dù tôi đã sử dụng nó chỉ để rõ ràng và đầy đủ. Tôi không phải ai đó tin rằng mã terse là mã tốt nhất. Các giá trị sắp tới được xác định trong một liệt kê ở phía máy chủ và do đó sẽ không bao giờ ở một số định dạng không chuẩn. –

2

Tôi gặp vấn đề tương tự và vấn đề hóa ra là khi nó được hiển thị dưới dạng giá trị int, câu lệnh chuyển đổi đã đọc nó dưới dạng biến chuỗi. Có thể không phải là trường hợp ở đây, nhưng đó là những gì đã xảy ra với tôi.

0

Bạn có chắc là ResultType là số nguyên (ví dụ: 0) chứ không phải một chuỗi (ví dụ: "0")?

Điều này có thể dễ dàng giải thích sự khác biệt trong hành vi

+0

Đó chắc chắn là một số nguyên theo FireBug. Không phải đó là nguồn dứt khoát, mà là một chỉ số khá tốt. –

0

Dường như việc thay đổi thành parseInt (msg.ResultType) đã buộc công cụ JavaScript xử lý chính xác nó như một số nguyên. Cảm ơn đã giúp đỡ.

2

Hãy thử điều này:

switch (msg.ResultType-0) { 
    case 0: 
    $('#txtConsole').val("Some Val 0"); 
    break; 
    case 1: 
    $('#txtConsole').val("Some Val 1"); 
    break; 
    case 2: 
    $('#txtConsole').text("Some Val 2"); 
    break; 
} 

Các -0 sẽ buộc (ép buộc) nó để điều trị có giá trị của bạn như là một số nguyên không thay đổi giá trị, và nó ngắn hơn nhiều so parseInt.

+0

Đây là một trong những câu trả lời phù hợp, nhưng không giải thích bằng cách sử dụng parseInt. –

+0

Và có lẽ, Javascript sẽ chỉ được gọi parseInt đằng sau hậu trường, vì vậy tất cả chúng ta đang tiết kiệm được một chút gõ. –

+0

Đã thử điều này và nó không hoạt động. Tôi vẫn kết thúc với vấn đề ban đầu. Các parseInt (có và không có radix) làm việc đáng tin cậy. –

0

Điều đầu tiên tôi nhận thấy là trong hai trong ba trường hợp, bạn đang gọi .val() và thứ ba bạn đang gọi .text().

Nếu bạn cố gắng thay đổi các câu lệnh thành chuỗi thay vì int, thì điều duy nhất tôi có thể nghĩ là bạn đang đánh một ngoại lệ ở đâu đó dọc theo dòng có thể do truy cập biến không xác định.

0

Có lẽ việc cưỡng chế mạnh mẽ nhất để int sẵn trong ES5 là:

 msg.ResultType | 0 

Đây là một trong những viên đá nền tảng mà trên đó asm.js cư trú. Điều này dẫn đến rất tối ưu hóa ES5 và được sử dụng bởi biên soạn vào sự hiện diện của:

"use asm" 

chỉ thị (trong FF và Chromium). Kết quả cưỡng chế này trong kiểu Int32 được sử dụng cho các số trong ES5 đại diện cho một "int". Vì vậy, giải pháp công thức nấu ăn cho câu hỏi ban đầu từ 5 năm trước là:

"use strict" ; 
$("#txtConsole").val(
    switch (msg.ResultType | 0) { 
    case 0: 
      "Some Val 0"; 
    break; 
    case 1: 
     "Some Val 1"; 
    break; 
    case 2: 
     "Some Val 2"; 
    break; 
    default : 
     "Illegal ResultType"; 
    }); 
Các vấn đề liên quan