Oo緣來是你oO


          posts - 120,comments - 125,trackbacks - 0
          ?????????????????????????????? JavaScript中的Boolean,你了解多少?
          ???????????????????????????????????????????????????????馬嘉楠??????2006-10-30


          今天看了一下Flyingis寫的《ECMAScript 基礎》一文。在看到
          Boolean類這一塊內容的時候,隨手寫了幾行代碼,問題出現了^+^
          注:此文討論的是JavaScript1.5


          還是先來看一段非常簡單的代碼

          // code:1
          var ?x? = ? false ;???
          var ?y? = ? true
          ;

          // code:2

          var ?xObject? = ? new ?Boolean( false );
          var ?yObject? = ? new ?Boolean( true
          );

          // code:3

          var ?resX? = ? new ?Boolean(x);
          var ?resY? = ? new
          ?Boolean(y);

          // code:4

          var ?resXObject? = ? new ?Boolean(xObject);
          var ?resYObject? = ? new
          ?Boolean(yObject);

          // code:5

          alert( " resX?=? " ? + ?resX? + ? " ?and?resY?=? " ? + ?resY);
          alert(
          " resXObject?=? " ? + ?resXObject? + ? " ?and?resYObject?=? " ? + ?resYObject);

          你明白code:1~4 之間的區別么?(你一定對code:1最為熟悉,這是我們最常用的)
          你知道code:5 的輸出結果么?(可以先想想,在運行代碼看結果,如果不明白,可以繼續看下去)


          如果你已經開始頭暈了,那就暫時不去想了,看我下面的解釋。
          如果你都知道了(哇,高手啊,呵呵^+^),那我還有個問題需要你的解答,在此先謝過了。


          正文:
          JavaScript中的Boolean類型

          1.???我們所熟悉的

          var x = false;
          var y = true;

          這是我們大家都熟悉的,此時我們使用的是原始的Boolean值(the primitive Boolean values )true和false

          2.???我們很少用到的

          var xObject = new Boolean(false);
          var yObject = new Boolean(true);

          此時我們聲明了一個Boolean對象,Boolean對象是對Boolean值的一個封裝。
          Boolean對象:一個值為true或false的Boolean對象。

          原始的Boolean值和Boolean對象是有區別的,不要相互混淆,引用Core JavaScript 1.5 Reference中的一句話:Do not confuse the primitive Boolean values true and false with the true and false values of the Boolean object.


          3.???區別

          區別(1):???聲明形式

          區別(2):???在條件語句(condition statement)中

          var?x?=?false;
          var?xObject?=?new?Boolean(false);

          if(x)
          ????alert(
          "x?=?true");
          else
          ????alert(
          "x?=?false");

          if(xObject)
          ????alert(
          "xObject?=?"?+?xObject?+?",?but?in?the?condition?statement,?the?xObject?value?is?evaluated?to?true");
          else
          ????alert(
          "xObject?=?false");


          輸出結果:

          x?=?false
          xObject?
          =?false,??but?in?the?condition?statement,?the?xObject?value?is?evaluated?to?true


          當一個值為false的Boolean對象放到條件語句當中的時候,Boolean對象的值會被當作true來計算,但是它本身的值并沒有改變,依然是false。很有趣,我只知道現象,具體原因不清楚,不知道發明者出于什么地考慮。但是在JavaScript1.2或者更早的版本中卻有所不同,在條件語句(condition statement)中,Boolean對象的計算返回的是其對應的原始Boolean的值。


          區別(3):初始化Boolean對象

          聲明一個Boolean對象,如果我們用一個值為false的Boolean對象對其進行初始化,則新的Boolean對象的值為true

          var?xObject?=?new?Boolean(false);
          var?resXObject?=?new?Boolean(xObject);
          alert(
          "The?resXObject?value?is?"?+?resXObject);

          原始的Boolean值和Boolean對象區別如此之大,所以切記二者區別,不要混淆使用。

          對于code:5 的輸出結果,你現在明白是什么原因了吧。



          上面的東東我也是今天遇到了問題,查了一些資料才知道,學無止境啊。可是我的問題依然沒有解決。
          我的問題是關于Boolean對象的初始化。代碼如下,

          var?ob1?=?new?Boolean(false);
          var?ob2?=?(ob1&&true);
          var?ob3?=?(true&&ob1);
          var?ob4?=?Boolean(ob1&&true);
          var?ob5?=?Boolean(true&&ob1);
          alert(
          "ob2?=?"?+?ob2?+?"?ob3?=?"?+?ob3?+?"?ob4?=?"?+?ob4?+?"?ob5?=?"?+?ob5);

          結果:

          ob2?=?true?ob3?=?false?ob4?=?true?ob5?=?true

          js.JPG


          我對ob2 和 ob3的結果不太理解,為什么我只是更改了ob1和true的順序,結果去完全不同了。并且可以發現,結果均等于操作符“&&”后面的值。

          希望大家能告訴我!


          問題已經解決:

          ||是這樣運算的:從第一個開始,遇到有意義的返回,否則返回最后一個表達式(注意不一定是Boolean值);

          &&是這樣運算的:從第一個開始,遇到無意義的返回,否則返回最后一個表達式(注意同上);

          !是這樣運算的:
          對表達式的值取非(注意不是對表達式)。

          什么是無意義呢:如下六個 0,null,undefined,"",false,NaN。除此,視為有意義。

          new Boolean(),new Boolean(false)是同一個東西,由于它是一個對象,故是有意義的,但其值為false,所以,可以看為“有意義的false”,所以結果為最后一個表達式的值。

          謝謝
          jeffjie

          繼續學習^+^






          馬嘉楠
          jianan.ma@gmail.com

          posted on 2006-10-30 23:41 馬嘉楠 閱讀(4959) 評論(14)  編輯  收藏 所屬分類: Java Script

          FeedBack:
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 00:17 | JonneyQuest
          好像JavaScript的設計者把簡單的事情做得復雜了。
          這么設計有意義嗎?  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 00:53 | jeffjie

          var x = false;
          var xObject = new Boolean(false);

          if(x)
          alert("x = true");
          else
          alert("x = false");

          if(xObject)
          alert("xObject = " + xObject + ", but in the condition statement, the xObject value is evaluated to true");
          else
          alert("yObject = false");
          這個的原因我憑自已的經驗解釋一下:
          javascript 的 if表達式內的表達式如果不是比較表達式,即不是類似 == < > 這類的表達式時,會把里面的表達式當作一個對象來處理,只要這個對象不為空,就返回true,正如new Boolean(false)是一個Boolean的對象,不為空。如果你的表達式是這樣:if(xObject.valueOf() == true)的話,這時候就會返回Flase了。
          個人意見,python也是這樣處理if的表達式。

          至于
          var ob1 = new Boolean(false);
          var ob2 = (ob1&&true);
          var ob3 = (true&&ob1);
          這個,我重現不了您說的結果。
            回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 01:17 | 馬嘉楠
          @jeffjie

          謝謝啦
          問題已經解決:

          ||是這樣運算的:從第一個開始,遇到有意義的返回,否則返回最后一個表達式(注意不一定是Boolean值);

          &&是這樣運算的:從第一個開始,遇到無意義的返回,否則返回最后一個表達式(注意同上);

          !是這樣運算的:對表達式的值取非(注意不是對表達式)。

          什么是無意義呢:如下六個 0,null,undefined,"",false,NaN
          除此,視為有意義。

          new Boolean(),new Boolean(false)是同一個東西,由于它是一個對象,故是有意義的,但其值為false,所以,可以看為“有意義的false”,(正如你所說的一樣)。
          所以結果為最后一個表達式的值。

          繼續學習^+^
            回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 02:14 | jeffjie
          長知識了。謝謝。不過你最后的那個例子,在我的機子上的確重現不了。
          firefox1.5 ubuntu。。
          明天回公司用IE估計可以重現。應該是Javascipt的支持不同的原因。
          像上面的情況,的確有點令人費解。盡管是有道理。。呵  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 09:04 | xinheqishi
          長見識了,謝謝樓主。
          *****************************************************
          ||是這樣運算的:從第一個開始,遇到有意義的返回,否則返回最后一個表達式(注意不一定是Boolean值);

          &&是這樣運算的:從第一個開始,遇到無意義的返回,否則返回最后一個表達式(注意同上);

          !是這樣運算的:對表達式的值取非(注意不是對表達式)。
          *****************************************************
          請問在java中這些運算符號也是這樣操作的嗎??  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 10:22 | 馬嘉楠
          @xinheqishi

          *************************
          請問在java中這些運算符號也是這樣操作的嗎??
          *************************
          提示如下:
          The operator && is undefined for the argument type(s) Boolean, boolean.

          如果把ob1進行一下轉換就可以了,ob1.booleanValue(),但是此時該表達式已經是原始Boolean值false,所以結果為false.同時需要把ob2,ob3的類型改為boolean。
          如果把true改為Boolean.valueOf(true),依然提示錯誤:
          The operator && is undefined for the argument type(s) Boolean, Boolean.


          代碼如下:
          Boolean ob1 = new Boolean(true);
          boolean ob2 = ( ob1.booleanValue() && true );
          boolean ob3 = ( true && ob1.booleanValue() );
          System.out.println("ob2 = " + ob2 + " ob3 = " + ob3);
          輸出結果:
          ob2 = true ob3 = true


          當然,如果是操作符“&&”,遇到值為false的表達式就不再往下繼續計算,直接返回結果false.如果是操作符“||”,遇到值為true的表達式就不再繼續往下計算,直接返回結果true。 這個我們都知道,這種計算叫什么名字我突然想不起來了,呵呵
            回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 21:02 | Larry.Zhao
          其實就是這樣的,如果是對象的話,javascript是用對象存在與否來做條件判斷的,就是如果你給了一個沒有初始化的對象:if(a),那么就會被視為非真,這個在程序語言中是這樣表示的: if(a == null),但是在js里面可以表示為if(a)  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 21:29 | Flyingis
          @馬嘉楠
          var obj = new Boolean(false);
          if(obj) {
          alert("a");
          }
          else {
          alert("b");
          }
          這段代碼返回的結果正如jeffjie所說,if判斷的是對象是否存在,而不是對象的值。

          "這種計算叫什么名字我突然想不起來了"
          這是布爾運算。
          需要注意的是,在Java或C#中&&和&、||和|計算方式是有差別的,一種是兩側均進行計算,一種是滿足判斷條件則立即返回,布爾表達式的運算方向是從右到左。

          JavaScript這種語言除具有自身語法特點外,還受到瀏覽器兼容性、版本的影響,不同的瀏覽器及相同瀏覽器的不同版本對于JavaScript版本的支持是不同的,深究其語法有時會讓人很費解。  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2006-10-31 22:01 | 馬嘉楠
          @Flyingis

          確實讓人費解
          不過現在至少明白了一些JavaScript中的對象

          謝拉

            回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2012-08-09 10:45 | mrsy
          var resX = new Boolean(null);
          document.writeln(resX); //true
          document.writeln(resX.toString());//false
          誰能給我解釋一下這個是什么原因  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?[未登錄]
          2013-12-19 13:51 | hewei
          typeof true 'boolean'
          type of new Boolean(false) 'object'
          object 總為真   回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2015-10-31 10:43 | ezqrq
          @jeffjie
          對,所有的布爾對象要引用都需用(==true)判斷;如果要輸出值應該這樣
          var a;
          var ob1 = new Boolean(false);
          if (ob1==true)
          a==true;
          else
          a==false;
          然后用a代替ob1;
            回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2015-10-31 11:02 | ezqrq
          除此之外,容易混淆的還有數組與Array對象;數與Number對象;字符串和String對象;事件與Event對象  回復  更多評論
            
          # re: JavaScript中的Boolean,你了解多少?
          2015-10-31 11:52 | 伊澤godv
          var s = "Test", S=new String("Test");
          console.log(s == S);//true
          console.log(s === S);//false  回復  更多評論
            
          主站蜘蛛池模板: 兴隆县| 犍为县| 瓮安县| 城固县| 怀远县| 龙岩市| 丰县| 深泽县| 兴海县| 盐津县| 屏南县| 通州区| 洪雅县| 宜州市| 望都县| 西安市| 扎赉特旗| 蛟河市| 翁源县| 望江县| 白玉县| 庄河市| 天长市| 盐边县| 志丹县| 江华| 涿州市| 乌兰浩特市| 饶平县| 固原市| 马关县| 聂荣县| 边坝县| 开远市| 惠东县| 黎川县| 河间市| 双柏县| 新沂市| 同德县| 上饶市|