我們知道,默認情況下,下面的'obj'是字符串。如果不使用'parseInt',JavaScript如何與數字進行比較?JavaScript:與數字相比的字符串
obj = document.frm.weight.value;
if(obj < 0 || obj > 5){
alert("Enter valid range!");
return false;
}
我們知道,默認情況下,下面的'obj'是字符串。如果不使用'parseInt',JavaScript如何與數字進行比較?JavaScript:與數字相比的字符串
obj = document.frm.weight.value;
if(obj < 0 || obj > 5){
alert("Enter valid range!");
return false;
}
如果<
或>
被編號,另一個將被鑄造到多個操作數之一。
alert("3" > 3); // false
alert("3.5" > 3); // true
編輯並進一步解釋:
如果它是不可能的其他參數鑄造成一個數字,它被澆鑄成稱爲NaN
的特殊價值 - 的縮寫代表「ñ ot aN umber「。 NaN
值具有絕對無法比擬的特殊屬性 - 如果其中一個參數是NaN
,則所有關係運算符如<
,>
和=
都將返回false
。
alert("" > 3); // false
alert("3.5?" > 3); // false
alert({} > 3); // false
另外,還要注意的是,在第二行,如果我們使用
alert(parseInt("3.5?") > 3);
它會提醒true
,因爲parseInt
讀取字符串"3.5?"
"3.5"
,然後停在"?"
閱讀並由此評估爲3.5
。然而,
alert("3.5?" > 3);
回報false
因爲string
投給number
並不像parseInt
仁者。由於"3.5"
確實不是一個數字,它被鑄造成NaN
。
如果另一個可以轉換爲數字,即'((「a」> 5)||(「a」<5))'爲假。 –
@AlexeiLevenkov在這種情況下,解釋器會嘗試將''a''轉換爲數字。由於這不能完成,它被轉換爲'NaN' - 「不是數字」,因爲確實'a'不是一個數字。與'NaN'的任何比較都會導致錯誤。 – Imp
+1。因爲它現在是完整的解釋。考慮合併你的評論到自己的答案。 –
該字符串將使用任意規則轉換爲數字。通常您會看到如下規則:
0x
開頭,請將其視爲十六進制數字。0
開頭,請將其視爲八進制數。 (並非在所有瀏覽器中)這特別意味着,如「09」輸入可能是令人困惑的到瀏覽器,並將其可被解釋爲9
或0
(因爲9不是有效的八進制數字)。
通常,將字符串與數字進行比較時,應始終使用基數參數10
手動調用parseInt
。那樣,沒有什麼驚喜。
那麼,作爲一個EMCAScript實現,使用Javascript將遵循摘要關係比較算法如在ECMA-262的11.8.5部分定義。
首先使用Javascript將適用於兩個操作數的內部操作ToPrimitive
,它必須返回原始值基於傳遞到的參數(不確定,布爾,串,空或號)它。如果將原始值傳遞給ToPrimitive
,則返回值是傳遞給操作符的參數值,如果它是Object的內部方法,即Javascript實現中的所有對象被調用的內部方法,則返回值爲[[DefaultValue]]。 該方法負責返回Object表示的基元類型。根據代碼類型的不同,該方法可能會調用對象的toString
或valueOf
方法。
例如:
var x = {valueOf: function() { return 3; }};
console.log(x > 2); // true
console.log(x < 1); // false
console.log(x == 3); // true
如何JavaScript的決定應該調用哪個方法?那麼,ToPrimitive
運營商可能會收到一個可選參數,它用於優先考慮特定的類型,例如, Number
或String
。 如果通過Number
,則將首先調用valueOf
方法,如果該方法不存在於對象中或不返回基元類型,則調用toString
。如果通過String
,則會發生相反的情況:toString
被首先調用,如果它既不存在於Object中也不返回原始值,則調用valueOf
。
這就是爲什麼在上面的代碼片段中,我可以自由比較對象和原始類型。理解處理比較時非常重要。
之後,如果兩個操作數都是Strings
的JavaScript將按照有關Unicode標準的一些有趣和特定的算法,檢查代碼點的值。否則,Javascript會將這兩個操作數強制轉換爲Number
,並比較它們的數學值。請注意,如果它們中的一個是NaN,則比較評估爲undefined,其將在if
語句中爲false。
一些例子:
// true => ToNumber(true) > ToNumber(false)
console.log(true > false);
// true => ToNumber("5") < ToNumber(10)
console.log("5" < 10);
// false ToNumber(ToPrimitive(obj, Number)) == ToNumber(10)
console.log(({valueOf: function() { return 10}}) > 10);
// false, it's not related to the length of the strings,
// the code point value of each char is used to evaluate the comparison
console.log('Hello worlds' > 'hello');
希望這有助於澄清一些東西。
我猜類型強制? – Joseph