2014-02-19 25 views
0

我想在這裏明白了什麼,最好的方式來解釋自己是通過提供一個例子:爲什麼在JavaScript中「」==「0」是錯誤的?

"" == false 
// true 

"0" == false 
// true 

false == false 
// true 

但是這裏什麼發生?

"" == "0" 
// false 

如果""評估爲false"0"評估爲false邏輯預測,這是相同的,因爲我寫false == false

我知道我在比較兩個字符串,但語言如何知道"a" == "b""" == "0"之間的區別?在這種情況下,強制是如何發生的?

+11

您的行爲好像沒有關於文檔== –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators –

+1

'=='不是傳遞性的,'' a == b'和'b == c'並不意味着'a == c'。算法在spec [** here **](http://es5.github.io/#x11.9.3);您想要的位是:如果Type(x)是String並且Type(y)是Number,則 會返回比較結果ToNumber(x)== y。 **並將其與**進行比較如果Type(x)與Type(y)相同,那麼如果Type(x)是String,則返回true,如果x和y是完全相同的字符序列(長度相同並且相同在相應位置的字符)。否則,返回false。 –

回答

12

爲什麼「」==「0」在javascript中爲false?

因爲操作數是兩個字符串具有不同的內容。僅當操作數的數據類型是不同纔會發生類型強制。

相關問題:


如果""計算結果爲假,"0"評估爲false邏輯預測,這是相同的,因爲我寫的false == false

讓我們來看一看的比較實際上是如何解決:

"" == false被脅迫0 == 0

"0" == false被脅迫0 == 0

false == false:相同的數據類型,因此值是直接比較

正如你所看到的"0"沒有「評估」到false,它被轉換爲整數,並且的值進行比較。 (""確實評估爲false(空字符串),但轉換爲數字時,它爲0)。

有轉換值到布爾和比較值到布爾之間有很大的區別。最明顯的例子:!!"0"true)和"0" == falsetrue)。

當您使用鬆散比較(==)比較不同數據類型的值時,它們總是被強制爲數字(如果您正在比較對象與字符串,則可能會使用字符串)。

查看specification以獲取有關比較算法的更多信息。

+1

附加說明:來自規範[11.9.3 1.d](http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3) – Xotic750

1

兩個操作數都被視爲字符串(因爲""是一個字符串,"0"也被視爲字符串),所以比較返回false

等於(==)

如果兩個操作數是相同類型的不,JavaScript的轉換操作數 然後應用嚴格比較。如果任一操作數是 或布爾值,則操作數在可能的情況下轉換爲數字;否則 如果任一操作數是一個字符串,則另一個操作數在可能的情況下轉換爲 字符串。如果兩個操作數都是對象,那麼JavaScript 會比較內部引用,這些內部引用在操作數引用內存中的同一個對象時相等。

Comparison Operators在Mozilla開發者網絡

+0

您可以指向參考嗎? – dpan

+0

當然,請參閱[11.9.3抽象平等比較算法](http://es5.github.io/#x11.9.3) - 這概括了費利克斯在他的答案中遵循的確切規則。 – user2864740

0

我想你給的例子,我發現了有趣的事情是0和「」被認爲是等於假。我知道0代表虛假,但我剛剛纔知道「」。謝謝你。 :)

現在,我試着比較「」== 0這給了我真實的。因此,這裏發生的是,因爲比較的兩個操作數不是相同的數據類型,所以javascript將它們轉換(強制發生),並且您自己檢查並聲明它們都是相同的,即false和false == false是對的。但是當你嘗試比較「」==「0」,導致它們周圍的雙引號時,它們被視爲String和字符串,因爲它們的內容不同。這是我們在那裏得到假的原因。

感謝這個問題,這不是最好的,但我嘗試和學到了一些東西。 :)

0

這是由於Javascript處理等式檢查有點奇怪的方式:您可以使用==隱式類型轉換來檢查值,或使用===檢查類型和值。

這也意味着,如果與==相比「falsish」值列表評估爲false""0undefinednull

現在:"" == "0"是在比較兩個字符串,有明顯的不同。

凌亂的問題是爲什麼"0" == false

這是做的Javascript spec==做:

如果兩個操作數是不一樣的類型,JavaScript的轉換 操作數則實行嚴格的比較。如果任一操作數是數字 或布爾值,則操作數在可能的情況下轉換爲數字;否則 如果任一操作數是一個字符串,則另一個操作數在可能的情況下轉換爲 字符串。如果兩個操作數都是對象,那麼JavaScript 會比較內部引用,這些內部引用在操作數引用內存中的同一個對象時相等。

當你比較"0"到布爾它首先被轉化爲數字,0,這就是「falsish」。當您比較"0"與字符串時,會比較字符串。

如果直接轉換(不使用==)然後"0"計算結果爲true:

if("0") console.log('Now "0" is true!') 
+0

*「這也意味着,如果與==相比,'falsish'值的列表的計算結果爲false':」,0,undefined,null「*我會對這裏的措辭非常滿意。在比較中,這些值中沒有一個「評估」爲「錯誤」。如果有的話,他們被轉換成數字(如你稍後提到的)。甚至在算法中有'undefined'和'null'的特殊情況(儘管它們實際上也可以轉換爲數字,在這種情況下,結果是'NaN')。 –

0

看看此規範,

http://es5.github.io/#x11.9.3

If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false. 

這說明了一切。

相關問題