2012-04-23 107 views
7

我需要根據某些廣播組的值禁用/啓用某個按鈕。這些收音機由一些常規代碼填充,因爲我使用grails,這是Groovy的框架,這是java的超集。那麼解釋就是說無線電的價值被定義爲布爾值,這很自然,因爲它們對應於是/否的答案。Javascript布爾值:false && true true results in true

現在,要禁用/啓用此按鈕,我使用了一些javascript,但它帶有布爾值的香蕉。正如標題狀態,在某些時候,我做了邏輯和保存false一個變量,並保存true

這裏的另一個變量之間是有問題的代碼peice的:

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); 
}); 

正如你可以看到我用在執行console.log進行調試,這也是在某些時候是什麼拋出:

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 

因此,真正& &假==假的,但假& & true == true?請注意,這些值沒有引號,因此它們是布爾值(我正在使用Chrome控制檯進行調試,它代表雙引號內的字符串,因此您可以區分true和「true」)。

任何想法?

另外,像var x = true && false這樣的手動比較總是按預期工作,對於存在問題的變量是非常有用的。

+0

因爲這顯然是很奇怪的,我想減少這種例子在最小測試用例將是你有用。 – zmccord 2012-04-23 05:16:48

+1

http://twitter.com/#!/mattmight/statuses/191964430312030208在PHP和JavaScript中,「==」發音爲「可能等於」。 – 2012-04-23 05:36:33

回答

11

從您選中的單選按鈕輸入this.value實際上並不是一個布爾值,它是一個字符串。字符串和布爾值的比較可能會導致類似的問題。這是認爲最佳做法是使用===進行比較的原因之一。

看到這個問題的全部細節; JavaScript === vs == : Does it matter which 「equal」 operator I use?

+0

如果它不是一個布爾值,那麼我認爲它被隱含地轉換爲一個,因爲控制檯輸出的是真,而不是「真」或「真」。另外,當我嘗試將廣播的值放入標籤或其他所有html標籤中時,直到明確地轉換'.toString()'後纔會顯示它。這就是爲什麼我認爲它是一個布爾值而不是字符串。 – GalmWing 2012-04-23 05:51:06

+0

我最終扔掉了布爾和使用的數字。作爲一個教訓:在js中,當值存在於HTML標籤中時,從不使用布爾值。由於這個答案陳述了真正的問題「實際上並不是一個布爾值,所以它是一個字符串」,我會接受它(並且對於延遲延遲抱歉)。 – GalmWing 2012-10-22 01:29:38

0

嘗試按位和&&&。後者適用於條件比較,但不適用於將值分配給變量。

0

這真的是你想要做的嗎? :

actual = actual && this.value; 

這是一樣的:

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

actual總是true在你的代碼中定義的,所以actualthis.value,而不是一個布爾值。

+0

這是我究竟在做什麼? 'actual'並不總是如此,就像你在日誌輸出中看到的一樣。 – GalmWing 2012-04-23 05:57:15

1

這必須要做的東西(之一)的無線電控制的值,因爲在普通的JavaScript這個評估預期:

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] 

可能的this.value顯式轉換幫助,因爲this.value實際上是的字符串:

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

注意,&&執行以下操作:

返回expr1是否可以轉換爲false;否則,返回 expr2。

source

所以在這樣的情況:

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) 

返回的值不一定是布爾值,該解決方案將迫使布爾!(x&&y)

所以我的猜測是這樣的事情正在發生

2

,如果你試圖用邏輯運算符來計算,記住:

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" 

因爲: 的JavaScript法官的第一個操作數,如果是真的它將返回第二個操作數,否則返回false;它就像:

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

result = first ? second : false; 

這是JavaScript邏輯運算符實際運作方式。 你必須在不同的變量類型之間進行嚴格的比較:

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

字符串不是空等於(布爾型),甚至是「假的」。

,並記住,HTML元素的屬性是「字符串」 s

相關問題