0

我們知道,默認情況下,下面的'obj'是字符串。如果不使用'parseInt',JavaScript如何與數字進行比較?JavaScript:與數字相比的字符串

obj = document.frm.weight.value; 
if(obj < 0 || obj > 5){ 
    alert("Enter valid range!"); 
    return false; 
} 
+1

我猜類型強制? – Joseph

回答

2

如果<>被編號,另一個將被鑄造到多個操作數之一。

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

+0

如果另一個可以轉換爲數字,即'((「a」> 5)||(「a」<5))'爲假。 –

+0

@AlexeiLevenkov在這種情況下,解釋器會嘗試將''a''轉換爲數字。由於這不能完成,它被轉換爲'NaN' - 「不是數字」,因爲確實'a'不是一個數字。與'NaN'的任何比較都會導致錯誤。 – Imp

+0

+1。因爲它現在是完整的解釋。考慮合併你的評論到自己的答案。 –

0

該字符串將使用任意規則轉換爲數字。通常您會看到如下規則:

  • 如果字符串以0x開頭,請將其視爲十六進制數字。
  • 如果字符串以0開頭,請將其視爲八進制數。 (並非在所有瀏覽器中)
  • 否則,將其視爲十進制。

這特別意味着,如「09」輸入可能是令人困惑的到瀏覽器,並將其可被解釋爲90(因爲9不是有效的八進制數字)。

通常,將字符串與數字進行比較時,應始終使用基數參數10手動調用parseInt。那樣,沒有什麼驚喜。

3

那麼,作爲一個EMCAScript實現,使用Javascript將遵循摘要關係比較算法如在ECMA-262的11.8.5部分定義。

首先使用Javascript將適用於兩個操作數的內部操作ToPrimitive,它必須返回原始值基於傳遞到的參數(不確定布爾)它。如果將原始值傳遞給ToPrimitive,則返回值是傳遞給操作符的參數值,如果它是Object的內部方法,即Javascript實現中的所有對象被調用的內部方法,則返回值爲[[DefaultValue]]。 該方法負責返回Object表示的基元類型。根據代碼類型的不同,該方法可能會調用對象的toStringvalueOf方法。

例如:

var x = {valueOf: function() { return 3; }}; 

console.log(x > 2); // true 
console.log(x < 1); // false 
console.log(x == 3); // true 


如何JavaScript的決定應該調用哪個方法?那麼,ToPrimitive運營商可能會收到一個可選參數,它用於優先考慮特定的類型,例如, NumberString。 如果通過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'); 

希望這有助於澄清一些東西。