1. 程式人生 > >js隱式轉換問題

js隱式轉換問題

        //當下面按鈕全選中時,上面按鈕也選中
         var flag=true;
         $tbodyCheckboxs.each(function(i){
          if($tbodyCheckboxs.eq(i).prop('checked')!='checked'){
            flag=false;
          }
         }) 
         $('thead input').prop('checked',flag);

       今天在專案裡寫複選框的全選功能時,遇到了一個坑,這個坑就是js的隱式轉換,雖然知道這個東西,但是卻記錯了,搞了半天才發現原來是這麼一個小錯誤。

       問題:不管下面的複選框選沒選中,$tbodyCheckboxs.eq(i).prop('checked') != ‘checked’都返回true,導致flag都會變成false,從而$('thead input')這個總的複選框永遠不會被選中。

--------------------------------------------------------------------此段廢話--------------------------------------------------------------------------------------------

      (首先清楚的是,表單元素的一些屬性只有一個屬性值,且值就是本身時,在用js或jq操作的時候,它的值是布林值(獲取的值是布林值,設定值的時候是布林值或者能轉換成對應布林值的其他型別的值);所以在這裡$tbodyCheckboxs.eq(i).prop('checked')的值是true或false,本來這裡就讓$tbodyCheckboxs.eq(i).prop('checked') !=true就沒有任何問題,但我知道js在判斷全等和全不等的時候會有型別轉換,所以寫了‘checked’,結果因為對相等操作符的型別轉換規則記憶有誤,導致錯誤,一直判斷的是    布林值 != ‘checked’。)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      總的來說,在轉換不同的資料型別時,相等和不相等操作符遵循以下基本規則:

      1.如果有一個運算元是布林值,則在比較相等性之前現將其轉化成數值----false為0,true為1;

       2.如果一個運算元是字串,一個是數值,在判斷相等性之前,先把字串轉換為數值;

       3.如果一個運算元是物件,另一個運算元不是,則呼叫物件的valueOf()方法,用得到的基本型別的值去比較

       4.null和undefined相等,它倆在判斷相等性時,不會型別轉換;

      5.NaN不和任何值相等;

      6.兩個都是物件,則判斷是不是同一個物件。

總結這麼多,一句話,為了避免錯誤,以後儘量用全等===和全不等!==