2012-04-23 38 views
7

Tôi cần tắt/bật nút tùy thuộc vào giá trị của một số nhóm radio. Những radio này được phổ biến bởi một số mã groovy bởi vì tôi đang sử dụng grails, một framework cho groovy, đó là một phần lớn của java. Vâng giải thích đó là để nói rằng các giá trị của các radio được định nghĩa là boolean, mà chỉ là tự nhiên bởi vì chúng tương ứng với câu trả lời có/không.Javascript booleans: false && true results in

Bây giờ, để tắt/bật nút này, tôi sử dụng một số javascript, nhưng nó đi chuối với các giá trị boolean. Theo các tiểu bang tiêu đề, trên một số điểm tôi làm một logic và giữa một biến chứa false và một biến chứa true

Đây là mảnh mã có vấn đề:

var actual = true; 
$('.requerido input:radio:checked').each(function() { 
    console.log("actual: " + actual); 
    console.log("value: " + this.value); 
    console.log("actual and value: " + (actual && this.value)); 
    actual = actual && this.value; 
    console.log("actual: " + actual); 
}); 

Như bạn có thể thấy tôi sử dụng các console.log để gỡ lỗi, và đây là những gì ném tại một số điểm:

actual: true 
value: true 
actual and value: true 
actual: true 

actual: true 
value: false 
actual and value: false 
actual: false 

actual: false 
value: true 
actual and value: true 
actual: true 

vì vậy, đúng & & sai == sai, nhưng sai & & true == true? Lưu ý rằng các giá trị không có dấu ngoặc kép, vì vậy chúng là các giá trị boolean (tôi đang gỡ lỗi bằng cách sử dụng bảng điều khiển Chrome đại diện cho các chuỗi bên trong dấu ngoặc kép, vì vậy bạn có thể phân biệt giữa true và "true").

Bất kỳ ý tưởng nào?

Ngoài ra, thực hiện so sánh thủ công như var x = true && false luôn hoạt động như mong đợi, rất phù hợp với các biến mà sự cố xảy ra.

+0

Vì đây rõ ràng là rất lạ, tôi nghĩ rằng giảm ví dụ này để một trường hợp thử nghiệm tối thiểu sẽ hữu ích cho bạn. – zmccord

+1

http://twitter.com/#!/mattmight/statuses/191964430312030208 Trong PHP và JavaScript, "==" được phát âm là "có thể bằng". –

Trả lời

11

Các this.value từ đầu vào nút radio đã kiểm tra của bạn không thực sự là một boolean nó là một chuỗi. So sánh các chuỗi và giá trị boolean có thể gây ra các vấn đề như thế này. Đó là một trong những lý do tại sao nó được coi là thực hành tốt nhất là sử dụng === để so sánh.

Xem Câu hỏi SO này để biết chi tiết đầy đủ; JavaScript === vs == : Does it matter which “equal” operator I use?

+0

nếu nó không phải là một boolean sau đó tôi giả định rằng nó được ngầm chuyển đổi thành một, bởi vì giao diện điều khiển in đúng và không phải là "true" hoặc "true". Ngoài ra khi tôi cố gắng để đặt giá trị của các đài phát thanh bên trong một nhãn hoặc tất cả các thẻ html khác, nó không được hiển thị cho đến khi tôi cast '.toString()' một cách rõ ràng. Đó là lý do tại sao tôi cho rằng đó là một boolean và không phải là một chuỗi. – GalmWing

+0

Tôi đã kết thúc ném đi các booleans và sử dụng số thay thế. Như một bài học: trong js không bao giờ sử dụng boolean khi một giá trị nằm bên trong một thẻ HTML. Vì câu trả lời này nói lên vấn đề thực sự "không thực sự là một boolean nó là một chuỗi", tôi sẽ chấp nhận nó (và xin lỗi vì sự chậm trễ loooong). – GalmWing

0

Thử bitwise và & phó &&. Sau này sẽ là thích hợp trong một so sánh có điều kiện, nhưng không phải trong việc gán một giá trị cho một biến.

0

Đây có phải là điều bạn thực sự muốn làm không? :

actual = actual && this.value; 

Đó là giống như:

if (actual) { 
    actual = this.value; 
} 

actual luôn true là theo định nghĩa trong mã của bạn, vì vậy actual sẽ this.value và không phải là một boolean.

+0

Đó có phải là những gì tôi thực sự đang làm không? 'thực tế' không phải lúc nào cũng đúng, như bạn có thể thấy trong đầu ra bản ghi. – GalmWing

1

này phải có để làm điều gì đó với (một trong) các giá trị của điều khiển radio, bởi vì trong đồng bằng javascript này đánh giá như mong đợi:

function boolx(tf,val){ 
    var test = tf && val; 
    console.log([tf,val,tf && val,test]); 
} 
tf(true,false); //=> [true,false,false,false] 
tf(false,true); //=> [false,true,false,false] 

Có lẽ một chuyển đổi rõ ràng của this.value giúp, vì this.value là thực sự một chuỗi:

var actual = true; 
$('.requerido input:radio:checked').each(function() { 
    var val = /true/i.test(this.value); 
    console.log("actual: " + actual); 
    console.log("value: " + val); 
    console.log("actual and value: " + (actual && val)); 
    actual = actual && val; 
    console.log("actual: " + actual); 
}); 
2

Lưu ý rằng && nào sau đây:

Trả về expr1 nếu nó có thể được chuyển thành false; nếu không, trả về expr2.

source

Vì vậy, trong những trường hợp như:

var truish=true;//interchangeable with anything different than 0,"",false,null,undefined,NaN 
var falsish=null;//interchangeable with 0,"",false,null,undefined,NaN 

alert(truish&&falsish);//null (falsish was returned) 

Giá trị trả lại không nhất thiết phải là một boolean, một giải pháp cho điều này là buộc một boolean !(x&&y)

Vì vậy, tôi đoán là một cái gì đó như thế này đang xảy ra

2

nếu bạn đang cố gắng để tính toán với những hoạt động logic, hãy nhớ rằng:

var result = true && "false";// always results (string) "false" 
var result = true && "true";// always results (string) "true" 
var result = false && "true";// always results (boolean) false 
var result = false && "false";// always results (boolean) false 
var result = "true" && true;// always results (boolean) true 
var result = "true" && false;// always results (boolean) false 
var result = "false" && true;// always results (boolean) true 
var result = "false" && false;// always results (boolean) false 
var result = "true" && "true";// always results (string)"true" 
var result = "true" && "false";// always results (string) "false" 
var result = "false" && "true";// always results (string) "true" 
var result = "false" && "false";// always results (string) "false" 

vì: javascript thẩm phán các toán hạng đầu tiên, nếu đúng nó sẽ trở lại với toán hạng thứ hai, nếu không return false; nó chỉ thích:

var first = true 
var second = "false"; 
if (first) { 
    result = second; 
} else { 
    result = false; 
} 

hoặc

result = first ? second : false; 

đây là cách javascript hành lý thực sự hoạt động. bạn phải thực hiện so sánh chặt chẽ giữa các loại biến khác nhau:

result = true && (value==="false"); 

chuỗi không có sản phẩm nào tương đương với (boolean) đúng, thậm chí là "false".

và nhớ rằng thuộc tính yếu tố html là "String" s

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