2012-08-27 133 views
15

我向一位同事解釋說,當比較JavaScript中的變量時,你應該使用===!==(和>==<==當然),這樣它就不會強制參數並且變得混亂和混亂,但是他們問我兩部分問題是我不知道答案,我想我會問的專家在這裏,具體地說,它是:Javascript等於三倍等於但大於和小於?

什麼>< - 當他們做比較,他們也強迫的參數或不 - 爲什麼不是有一些>><<運算符(可能需要一些其他的語法,因爲我猜他們會是位移操作符,如果它我整個C風格,但你得到的要點?)?

所以,我可以寫一個測試,以找到答案的第一部分,我做到了,那就是:

// Demo the difference between == and === 
alert(5 == "5"); 
alert(5 === "5"); 

// Check out what happens with > 
alert(5 > "4");  
alert(5 > 4); 

和它返回:

true 
false 

true 
true 

它確實是這樣看起來像>正在做強制> "4"> 4返回相同的結果。所以第二部分怎麼樣...

是否有某種運營商的><不強制類型(或者如何改變我的測試安全地執行測試)?

+3

實際上,在JavaScript中沒有'> =='或'<==',其原因與所述的答案相同。請參閱[比較運算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) –

回答

13

不,不需要這樣的操作員。這些關係運算符的類型檢查與平等和不平等不同。 (編輯 —也許這是一個小強說,有「沒有必要」,因爲JavaScript認爲它如此:-)

具體這是唯一真正的><>=<=運營商的所有操作要麼在兩個數值或兩個字符串,偏好數字值。也就是說,如果一個值是一個數字,那麼另一個被視爲一個數字。如果非數字不能完全轉換爲數字(也就是說,如果數字結尾爲NaN),則比較結果爲undefined。 (這是有點問題,因爲undefinedif語句的上下文中將看起來像false。)

如果兩個值都是字符串,則會執行整理字符串比較。

如果你仔細想想,這些比較對於對象實例沒有任何意義;一個物體「超過」另一個物體意味着什麼?我猜想,也許這意味着如果你發現自己的變體類型的值被這樣比較,那就是造成問題,那麼你就必須自己檢測這種情況。在我看來,在上游工作並考慮導致這種情況的代碼是否有些可疑是件好事。

+0

Agh,emoticlosing-parenthesicon ..! >。(但是+1無論如何。) –

+0

@DavidThomas對不起,但這是我的「快樂的SO參與者」角色 – Pointy

+0

'true> = 1'的一部分是真的:(但我同意它不像==運算符那樣令人煩惱 – Alex

8

是否有某種操作的時間>和<不把該類型

我怎樣才能改變我的測試進行測試安全

你將不得不明確地測試類型:

typeof a === typeof b && a > b 
1

我引用弗拉納根的JavaScript權威指南(第5版)並且似乎沒有非強制性的比較運算符。

你說得對,< <和>>確實是按位運算符,因此不起作用。

我建議你故意要挾值youself:

var num_as_string = '4'; 
var num = +num_as_string; 
if (5 > num) { ... } 
+0

什麼在'var num = + num_as_string;'中是否有'+ '語法的意思?' –

+1

@YatharthROCK:它是一元加運算符並將值轉換爲數字:https://developer.mozilla.org/en-US/docs /JavaScript/Reference/Operators/Arithmetic_Operators#-_.28Unary_Negation.29 –

0
12 > '100' // false 
'12' > 100 // false 
'12' > '100' // true 

正如其他人所提到的,如果是一些其他的澆鑄爲數字。規則同樣適用於這些案件,以及:

null > 0 // false 
null < 0 // false 
null >= 0 // true 

然而,有可能是你需要null >= 0false(或上述任何數字符串比較的情況下)的情況下,因此它是確實需要要嚴格比較>==<==

例如,我的Array.prototype.sort()compareFunction和像x>=0的表達會像對待null值就像0和把它們放在一起,而我想把它們放在別處。我必須爲這些情況編寫額外的邏輯。

Javascript說你自己處理它(在實踐中)。