DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> JavaScript教程:實例解析運算符
JavaScript教程:實例解析運算符
編輯:關於JavaScript     

在cssrain整理的一個 試題集 中有這麼一道題:

<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
var c = 1;
function assert (aVar) {
if (aVar==true)     alert(true);
else     alert(false);
}
assert(a) ;
assert(b) ;
assert(c) ;
</SCRIPT>

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行] 

按照我的理解,任何非0的數值的布爾值都應該為true。

可是這道題的正確輸出為:false false true。

(-1==true)的值為false。

再來看下面這個例子:

<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
var c = 1;
function assert (aVar) {
if (aVar)     alert(true);
else     alert(false);
}
assert(a) ;
assert(b) ;
assert(c) ;
</SCRIPT>

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行] 

運行結果依次為:false,true,true。

在這裡,我們發現,if(aVar) 和 if(aVar == true)的結果並不相同。

cssrain在 答案 中的解釋是:

if(aVar) 和  if (aVar==true) 對負數有截然不同的答案。

真的是負數的原因嗎?看下面這個例子:

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]

為什麼正數2返回的也是false呢。我們將數字轉換為boolean值看看。

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行] 

這裡非0數值的布爾值的確都是true,也就是說所有的問題都集中在2==true中的==運算符上。基本可以確定,==一定不是把數字轉換為布爾值再進行比較。

看看ECMA-262(第80頁)中怎麼說的:

6.If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
7.If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

也就是說,布爾值會被首先轉換為數字,然後進行比較。true的數字值為1,false為0。所以2和-1都不能和true相等。

進一步看下面這個例子:

<SCRIPT LANGUAGE="JavaScript">
var a = "undefined";
var b = "false";
var c = "";
function assert (aVar) {
if (aVar==true)     alert(true);
else     alert(false);
}
assert(a);
assert(b);
assert(c);
</SCRIPT>

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行] 

按照前面的思路,true會被轉換為1,所以三個語句都會返回false。運行一下,發現的確如此。

下面將if(aVar==true)改為if(aVar)。

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]

這時的運行結果是true,true,false。因為Boolean("undefined")、Boolean("false")、Boolean("")的結果為true,true,false。非空字符串轉換為布爾值true。

最後還有一個例子,解釋當==兩邊為字符串和數字時的比較規律。

運行代碼框

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]

發現沒,這個"001"==true是為true的。

因為true先被轉換為1了。然後參考ECMA的規則:

4.If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
5.If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.

字符串要被轉換為數字,Number("001")的值也為1,所以結果為true。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved