目录
逻辑与 &&
var re = A && B
A是一个表达式,B也是一个表达式,re等于A表达式或者B表达式,(如果A表达式判定为true)re就是B,否则反之.
如果 re为A表达式,那么B表达式就不运行.
通俗的说就是:
当A为true时,无论B是true或false,都会返回B。
当A为false时,无论B是true或false(B不会运行),都会返回A。
看题:滴滴出行面试题
var a=(b=0)&&(c=30);
console.log(a);
console.log(b);
console.log(c);
看这题需要掌握一些知识:
1.0做布尔判定时,会被判断为false
2.取一个变量的数据时(01.没有声明直接取值会报错 02.取的是最近一次保存的数据)
3. eg:a = 10; a变量没有声明就赋值,会隐式声明 var a = 10;
eg: var a = 10, a = 20; a变量已经声明,再次赋值,就会更新a中保存的数据为20
分析:(b = 0)进行布尔判定时,会取出b = 0,因为b没有声明,但是浏览器会隐式声明var b,b = 0,进行布尔判定时返回false,程序就不执行逻辑与&&另一端 (c=30)这个表达式,所以 a = 0, b = 0 ,因为(c=30)没有执行,所以内存中根本没有这个c变量,取值c也就取不到,报错。
注意点:这里为什么a的值不是false,而是0 .因为 b=0判定为false,所以返回的是 b= 0这个表达式的值,即0
逻辑或 ||
var re = A || B
A表达式的布尔判定为true, re = A,此时B表达式不会运行,反之 re = B
通俗的说:
当A为true时,无论B是true或false(B不会运行),都会返回A。
当A为false时,无论B是true或false,都会返回B。
var re = (a=100)||(b=0);
console.log(re); //100
分析:a = 100,先隐式声明 var a = 100, 布尔判定为真,就不再运行(b=0),所以返回的是(a=100)的值,所以re = 100
||在开发中,往往是优化的代码最常用的js符号(每个阶段都有优化)
后续学习再回来补充。
逻辑非 !
逻辑非!的运算过程:
先把变量的值取出来,然后转化为布尔值,再取反,再把取反的结果赋值给变量
注意:转化为布尔值可能为ture,也可能为false,看变量中存的值。
扩展:
其它类型转换为布尔类型:(重要)
只有 0 ,NaN , null, undefined ,空字符串' ',false转为布尔类型时为false,其余情况转换为布尔类型都是true。且没有特殊情况
console.log(Boolean(0)); //false console.log(Boolean(NaN)); //false console.log(Boolean(null)); //false console.log(Boolean(undefined)); //false console.log(Boolean("")); //false console.log(Boolean(false)); //false
eg:
var a = "isLogin"; //登录过
a= !a; // !a 把a的值取出来,然后转化为布尔值true,再取反,再把取反的结果赋值给变量a
console.log(a); //false
注意:a的值不同时,取出来转化的结果可能为true可能为false。
//取出来转化为布尔值true的 ,再取反变为false
// 1.一个非空(null)对象
var a = {n:1};
a = !a;
console.log(a);
// 2.一个非空字符串
var b = "aaaa";
b = !b;
console.log(b);
// 3.任意(非0)数值(包括Infinity)
var c = 1;
c = !c;
console.log(c);
//重点记忆
//取出来转化为布尔值false的 ,再取反变为ture
// 1.一个空字符串
var a = "";
a = !a;
console.log(a);
// 2.数值0
var b = 0;
b = !b;
console.log(b);
// 3.空对象 null
var c = null;
c = !c;
console.log(c);
//4.NaN
var d = NaN;
d = !d;
console.log(d);
//5.undefined
var e = undefined;
e = !e;
console.log(e);
逻辑非应用之开关思想
开关思想:在一个变量中保存一个布尔值,然后在业务执行时,修改这个变量的值为:取反,让通过变量的值执行分支业务。
var flag = true;
function fn(){ //函数每运行一次,flag的值都改变了(取反)
flag = !flag; //这样操作,调用一次函数运行if里面,再调一次运行else里面,就做成了分支
if(flag){
}else{
}
}
fn();
fn();
开关思想用处: 如果用户怎么了,就怎么,如果用户没怎么,就怎么
eg:如果用户冲了VIP就可以发弹幕,如果没冲VIP,就不能发弹幕。
后面学习回来再补充。(这里不用深究)
案例:
注意点:三个逻辑运算符(&&、||、!) 优先级是:!> && > || 。
//注意一点:优先级顺序
console.log(0 && 2 || 1); // 1
console.log(0 || 2 && 1); //1
console.log(0 && 2 && 3 || 1 || 4); //1
console.log(0 || 2 || 3 && 1); //2
console.log(0 || 2 || 3 && 1 && 4); //2 易错原因,没有注意优先级得到结果4
console.log(0 || 1 || 2); //1
console.log(0 || 1 || 2 || 3); //1
console.log(0 && 2 && 1); //0
console.log(0 && 2 && 1 && 3); //0