2013-04-15 59 views
1

在以下代碼中,a!= b==相比較時。我最初的想法是,JavaScript將使用與==相同的parseFloat轉換。任何人都可以解釋實際發生的事情,因爲我對此有點困惑。 b = 129解析時,所以它看起來parseFloat將解析到第一個非數字字符。JavaScript如何爲==進行類型轉換?

var a = '129t3.98'; 
var b; 

b = parseFloat(a); 

Here is the sample script fiddle.

我一直在尋找放在一起使用這是一個非常簡單的isNumeric()功能,但我想先了解它。

回答

1

正如您所注意到的,parseFloat函數將解析滿足數字文字語法的第一個字符。 From the spec

numberString最長前綴trimmedString,這可能是trimmedString本身,即滿足StrDecimalLiteral的語法。

然而,abstract equality comparison algorithm(這是==一樣)不遵循相同的規則:

如果Type(X)是字符串和類型(Ÿ)是Number,返回比較ToNumber的結果(X)== ý

這裏就是內部ToNumber操作必須說:

如果語法不能解釋String作爲StringNumericLiteral的擴展,那麼ToNumber的結果爲NaN。

所以,當你試圖用比較分析,從它產生的數你的字符串,你實際上是比較數NaN

+0

非常好的解釋。感謝你的幫助,詹姆斯。 – Yatrix

0

當您給出a = b時,b的值會變爲a,而不進行任何轉換。

當您將值賦值爲a = parseFloat(b)時,如果b是字符串類型,則a將是int類型。

但是,如果a = b被分配,那麼&b都是相同的類型。

if,2->int, '2' -> string 
2=='2' (true) 
2 === '2' (false) 

通過觀察上述轉換,您可以相應地處理您的代碼。