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,从而总的复选框永远不会被选中。

(首先清楚的是,表单元素的一些属性只有一个属性值,且值就是本身时,在用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.两个都是对象,则判断是不是同一个对象。

总结这么多,一句话,为了避免错误,以后尽量用全等===和全不等!==

你可能感兴趣的:(js隐式转换问题)