前景:哎,这两天接着一个前端大牛的代码写东西,看见是下面这种写法:
!!v.y && (newTime = v.y);
em 不是特别明白,因为平时用这些都是在 if 等里面运用的,查了一下理解了就写下来,方便大家理解,先来一波我们常用的写法
运用 !或者 !!的场景
var a = 1;
! a == 1; //false ,取反
!! a == 1 //true 双重否定是肯定,所以在 “! a == 1 ”的基础上在取反 就为 “true”
详解:
1、||(逻辑或):(看例子方便理解)
example1.逻辑运算符通常用于执行布尔代数 -- (这个就不用多说了 大家经常用到)
例子: 只要有一个为true,就返回
if( obj == null || obj == ""){
//上面的条件有一个满足,就可执行操作
}
example2.利用短路特性
例子:
当左边的表达式可以转换为true时,将返回左边表达式的值,并且不会去执行右边的表达式。
var a="zx";
a == "zx" || (a="xx");
//输出 true a的值:"zx"
//解析:a=="zx" 为 true 所以直接返回true,并且不会执行右边的表达式,所以a的值还是:zx
例子:
当左边的表达式可以转换为false时,才会去执行右边的表达式 ,并且返回右边表达式的值
var a ="zx";
a !="zx" || (a="xx");
//输出:"xx" a的值:xx
//解析:a != "zx" 为 false,所以会执行右边表达式:a="xx",并且返回值:xx,所以这里a的值为:xx
2.&&(逻辑与):
example1.逻辑运算符通常用于执行布尔代数 -- (这个就不用多说了 大家经常用到)
例子:只有前后都是true的时候才返回true,否则返回false
if( obj != null && obj != ""){
//上面的条件必须都满足,就可执行操作 -- 只有前后都是true的时候才返回true,否则返回false。
}
example2.利用短路特性
例子:
当左边的表达式能转换成false(例如:null,0或者undefined),那么将返回左边表达式的值,并且不会去执行右边的表达式。
var a = 1;
a !=1 && 5;
// 输出 false
//解析:a != 1 为false, 所以直接返回左边表达式的值:false,并且不会执行右边的表达式
当左边的表达式可以转换为true时,才会执行右边的表达式,并且返回右边表达式的值。
var a =1;
a == 1 && (a = 3);
//输出 a -- 3 执行了a=3的代码,并且返回了3
//解析: && 前面为true时,才会执行 && 后面的代码;a==1 为 true,就执行了(a =3)的代码,并且返回值
//注意:&& 后面的代码如果是表达式记得要用括号括起来 不要忘记() 奥
我在给大家看一个例子:
var a = "zx";
var y = (a == "zx" && (a="xx"));
//输出 y的值为:xx
//解析:&& 左边 为true,所以就执行了 右边的表达式,并且返回右边表达式的值"xx",所以y的值就为xx;
逻辑运算符优先级
!> && >||
补充:来一个大混杂的
var a = 5;
var b = (a > 6 && 0 || 1);
//输出: b的值:1
//分析:&& 优先级 高于 || 所以我们先看 &&
a > 6 && 0 => a > 6 为:false,所以不会执行后面的表达式,直接返回false;
false || 1 => 前面为false的话,直接返回后面表达式的值 ,所以返回 1;
所以 大家明白了吗????
总结:
&& 前面为:true 后面不会执行,返回前面的值
前面为:false 会执行后面表达式,并且返回后面表达式的值
|| 前面为:true 后面不会执行,返回前面的值
前面为:false 会执行后面表达式,并且返回后面表达式的值
ending 终于写完了。。。。。严重拖延症的我!~~~///(^v^)\\\~~~ 有不正确的欢迎指出奥