js 使用过程中遇到的知识点。

彻底理解js中的&&和||

javascript中,&&和||的用法比较神奇,经常用在对象上,例如a || b,如果a不存在,则返回b。a && b,如果a存在,则返回b,否则返回a。
光这样看,感觉他的概念还挺复杂的,这样去想的话,不但会在脑子里多出一个无用的概念,而且越记越混乱。看问题还是要看本质。

本质是什么呢?&& 和 || 的作用只有一个(定义):
进行布尔值的且和或的运算。当运算到某一个变量就得出最终结果之后,就返回哪个变量。

在javascript中:
以下内容会被当成false处理:”” , false , 0 , null , undefined , NaN
其他都是true。注意:字符串”false”也会被当做true处理,在未转型的情况下他是字符串,属于一个对象,所以是true。
所以:
a || b:如果a是true,那么b不管是true还是false,都返回true。因此不用判断b了,这个时候刚好判断到a,因此返回a。
如果a是false,那么就要判断b,如果b是true,那么返回true,如果b是false,返回false,其实不就是返回b了吗。
a && b:如果a是false,那么b不管是true还是false,都返回false,因此不用判断b了,这个时候刚好判断到a,因此返回a。
如果a是true,那么就要在判断b,和刚刚一样,不管b是true是false,都返回b。

来个复杂的例子(注意一点:在js中&&运算符优先级大于||)
假设:
var a=new Object(),b=0,c=Number.NaN,d=1,e=”Hello”;
alert(a || b && c || d && e); 表达式从左往右执行,先&&后||
1、(b && c):b是false,此时不需要判断c,因为不管c是true是false,最终结果一定是false,因此返回当前判断对象b,也就是0;
2、(d && e):d是true,这个时候判断e,此时不管e是true,是false,返回结果一定是e,e为true,因此返回”Hello”;
3、(a || b):a是true,此时不管b是true是false,结果都是true,所以不判断b,所以返回当前判断对象a,因此返回new Object();
4、(a || e):同上,因此返回a。
这个表达式最终结果为a,也就是new Object()

js中!和!!的区别及用法

使用javascript时,有时会在变量前面加上两个感叹号,这样做表示什么含义呢?Javascript中,!表示运算符“非”,如果变量不是布尔类型,会将变量自动转化为布尔类型,再取非,那么用两个!!就可以将变量转化为对应布尔值。
如果作为条件表达式,不需要使用!!进行转换,Javascript会自动转换,!!就只应用于将类型转换为布尔值。

js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,

  1. !可将变量转换成boolean类型,null、undefined和空字符串取反都为false,其余都为true。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    !null=true

    !undefined=true

    !''=true

    !100=false

    !'abc'=false
  2. !!常常用来做类型判断,在第一步!(变量)之后再做逻辑取反运算,在js中新手常常会写这样臃肿的代码:
    判断变量a为非空,未定义或者非空串才能执行方法体的内容

    1
    2
    3
    4
    var a;
    if(a!=null&&typeof(a)!=undefined&&a!=''){
    //a有内容才执行的代码
    }

实际上我们只需要写一个判断表达:

1
2
3
if(!!a){
//a有内容才执行的代码...
}

就能和上面达到同样的效果。a是有实际含义的变量才执行方法,否则变量null,undefined和’’空串都不会执行以下代码。

可以总结出来,“!”是逻辑与运算,并且可以与任何变量进行逻辑与将其转化为布尔值,“!!”则是逻辑与的取反运算,尤其后者在判断类型时代码简洁高效,省去了多次判断null、undefined和空字符串的冗余代码。

javascript之if(value)和if(!!value)的区别

没有任何区别。这种写法只是想当然而已。我反对if (!!var1)的写法。
同样无聊的写法还有:if ((var1 == var2) == true)。

if 接受“A condition expression that evaluates to true or false”,并非必须PrimitiveBoolean类型。
在《ECMAScript Spec》中,if (value)的语义相当于:if (ToBoolean(value))。
而Logical Not的语义相当于:not ToBoolean(value)。
即!!val相当于ToBoolean(value)。
也就是说:if (!!value)的语义相当于if(ToBoolean(ToBoolean(value)))。
如果你认为这种写法是合理的,那你为什么不继续写道:
if (!!(!!value))、
if (!!(!!(!!value)))
……?