2012-11-14 192 views
1

我有這樣的代碼:爲什麼字符串有時會變成javascript中的數字?

function getSessionGUID() { 
    return (S4()+S4()); 
} 

function S4() { 
    return (((1+Math.random())*0x10000)|0).toString(16).substring(1); 
} 

它清楚地返回一個字符串,但如果你運行了一堆的時候,你可以看到,它有時會返回無窮大。

for (var i = 0; i < 100000; i++){ if(getSessionGUID() == Infinity) console.log("INFINITY"); } 
871 x INFINITY 

然後我發現,如果你刪除| 0,它解決了這個問題:

function S4() { 
    return (((1+Math.random())*0x10000)|0).toString(16).substring(1); 
} 

結果:

for (var i = 0; i < 100000; i++){ if(getSessionGUID() == Infinity) console.log("INFINITY"); } 
undefined 

爲什麼會出現這種情況?在這兩種情況下,該值都被更改爲一個字符串。

+0

是隨機的,或在'i'的特定值? –

回答

2

該測試揭示了答案:

for (var i = 0; i < 100000; i++){ 
    var x=getSessionGUID(); 
    if(x == Infinity) console.log(x); } 
} 

它記錄像61e932841413e390

這些值是有效號碼,他們是太大了對於數字類型的值,因此它們會鑄成無限當被解釋爲一個數字時。

如果您在測試中替換=====,沒有發生轉換,並沒有什麼記錄。轉換是由==運算符引起的。

2

JavaScript是動態輸入的。沒有整數,浮點數。字符串數據類型。所有這些轉換都是在內部完成的,具體取決於上下文。

的+可根據上下文字符串連接或添加。

編輯:道歉。太晚了。但是,當與無窮大進行比較時,它是將數字轉換爲數字。在某些情況下,您生成了有效的數字。

+1

在什麼情況下'String + String == Infinity'? 'S4'似乎永遠不會返回一個數字 –

+1

兩個字符串應該總是給字符串嗎? – Moox

+0

「+」運算符不會導致無窮大。 –

0

如果你真的需要一些類型,你總是可以使用以下。
console.log(Number("1"));

+0

我需要一個字符串類型,但有時當我在GET請求中使用這個值時,它會轉換成無窮大 – Moox

+0

指定你需要的數字類型通常會更好(例如'Integer() )比泛型要複雜,指定'Number()'只是減少了類型強制的可能目標的數量 –

+0

Moox:這仍然是非常奇怪的,我從來沒有看到一個字符串在五年的web開發中轉換爲Infinity。知道這發生了什麼特定的字符串? –

2

我想我想通了。除了我的測試代碼外,其他所有內容都沒有錯。

如果你把這個字符串「11e51354」,你可以得到它斷言爲true,因爲使用Javascript檢查所有可能使其等於真實的類型。

"11e51354" == Infinity # True 

正確的測試將是:

"11e51354" === Infinity # False 

它仍然是一個字符串,但不知何故,而我是通過GET請求發送時,它被改造成這給了無限號碼類型。

3

您正在生成十六進制字符串。

當您使用==操作,解釋試圖將兩個值強制爲相同的數據類型。當比較字符串到Infinity時,該中間數據類型是Number。當這些字符串包含字母「e」(一個有效的十六進制數字)並且它們被強制爲一個Number時,javascript將其解釋爲10^x,最終得到的結果是一些巨大的數字。

Numbers in javascript are 8 bytes,因此大於1.7976931348623157e308的任何東西都被認爲等於Infinity

解決此問題的最簡單方法是將==更改爲===,這樣字符串不會被強制轉換爲數字。

if(getSessionGUID() === Infinity) 

http://jsfiddle.net/Uhkxm/

+0

+1真棒解釋。 –

相關問題