为了演示方便,需要首先告诉大家如何进行
断点:让程序运行到某一行代码的时候停下来,便于我们观察其内部运行状况
调试:通过不断的调整尝试,修复(fix)程序的缺陷(bug)
浏览器F12演示:
中文就是:如果(if)...否则(else)……的意思
假设我们要判断一个数是不是正数:
let number = -1; //或者 number = 1
if (number >= 0) {
console.log('正数');
}
if后面可以是结果为bool值的表达式,也可以直接是一个bool值变量。
let number = -1,
//可以用一个let声明多个变量,
//而且后面的变量可以使用前面的变量进行运算
isPositive = (number >= 0);
if (!isPositive) {
这时候注意:如果if后面直接就是一个bool值,不要用这种菜鸟写法:
if(isPositive == true) if(isPositive != true) //而是: if(isPositive) //直接读成:是正数 if(!isPositive) //直接读成:不是正数
if (number >= 0) {
console.log('正数');
}
if (number < 0) {
console.log('负数');
}
这样写运行结果没有错,但是有一个性能 上的问题:
假设 number = 100,它通过了 number > 0 的判断,输出:正数。正数就永远不可能为负数,还需要再走一次 number < 0 的判断么?
断点演示:
所以,这种情况,我们应该使用 else:
if (number >= 0) {
console.log('正数');
}else {
console.log('负数');
}
这里的else不会进行判断:只要没有满足前面的if条件,马上就会进入else分支。
注意:if和else中间不能再插入任何语句。
if并不强制要求必须搭配else,但是飞哥强烈建议你只要写了if,就总是要用else兜底!
这有两个作用:
if (passed)
{
console.log("正数");
}//else nothing
尤其需要注意的是,不要出现这样的代码:
let number = 1,
isPositive = false;
if (number > 0) {
isPositive = true;
} else {
isPositive = false;
}
居然和我犟可维护性!怎么就没有可维护性了?
let isPositive = number > 0;
if (isPositive) {
//添加的逻辑
}
注意上面所有代码,无论是 if() 还是 else ,后面都跟了{}。
但因为历史原因,如果if/else后面只有一句话,也可以(但强烈不建议!)省略掉这个{}
@想一想@:为什么?
let score = 98;
if (score > 60)
console.log("及格"); //单行语句符合语法
else
console.log("不及格"); //但是不推荐
console.log("补考"); //这句话就会有问题
上面的if...else...可以进一步重构:
let result;
if (a >= 0) {
result = '正数';
} else {
result ='负数';
}
console.log(result);
重构:在不改变代码运行结果的前提下,对代码进行调整优化——是提高代码质量的重要手段!
@想一想@:这算是优化么?还多了一行呢……
因为这种if...else...的情形非常常见,就产生了这种写法:
let result = a > 0 //条件
? '正数' //条件为真时取值
: '负数'; //条件为假时取值
这是一个由问号(?)和冒号(:)组成的三元(目)运算符。
PS:元/目:参与运算的对象(值/变量)的个数
上面的例子我们忽略了一点:如果 number=0,那么a既不是负数,也不是整数,我们应该直接输出“零”,这怎么实现?
if (number == 0) {
console.log('零');
} else {
if (number > 0) {
console.log('正数');
} else {
console.log('负数');
}
}
if (number === 0) {
console.log('零');
} else if (number > 0) {
console.log('正数');
} else {
console.log('负数');
}
嵌套和else if()可以自由组合,一直“分支”下去,可以实现更复杂的功能、完成复杂的需求。但复杂的层层分支是程序员的噩梦,o(╥﹏╥)o
如何选择?一般来说:
if (score == 0) { //外层比较的是score
console.log('零');
} else {
if (age > 0) { //内层比较的是age
console.log('正数');
} else {
console.log('负数');
}
}
比如,源栈可以根据学习时间打折优惠:
代码如何实现?(一起写)
if (weeks < 4) {
console.log("学费是:" + 888 * weeks);
} else if (weeks == 25) {
console.log("学费是:17888");
} else if (weeks > 12) {
console.log("学费是:" +888 * weeks * 0.8);
} else if (weeks < 8) {
console.log("学费是:" +888 * weeks * 0.9);
}
凡是拿着需求就开始写的,都是菜鸟!
上述需求是有问题的:
写代码之前,首先明确需求——这就是老鸟和菜鸟的区别!
你以后大概率上会发现:作为一个程序员在工作中伤你最深的、你最最头痛和痛苦的,不是“技术”,而是“需求”——模糊不清的需求、千变万化的需求、稀奇古怪的需求……
补充完善好需求之后,再经过整理(尤其注意顺序/层级)后的代码如下所示:
if(weeks<0 || weeks>25){
console.log("越界啦……");
}else{
if (weeks < 4) {
console.log("学费是:" + 888 * weeks);
}else if (weeks < 8) {
console.log("学费是:" +888 * weeks * 0.9);
}else if (weeks < 12){
console.log("学费是:" +888 * weeks * 0.95);
}else if (weeks < 25) {
console.log("学费是:" +888 * weeks * 0.8);
}else if (weeks == 25) {
console.log("学费是:17888");
}else{
console.log("咦?怎么回事?weeks=" + weeks);
}
}
if...else的整理,是程序员的基本功。从一开始就要严格要求自己:
程序不是能跑就行,一定要干净整洁通畅……或者总结为:可读性强!
除if...else以为,还有一种分支:
let grade = 2;
switch (grade)
{
case 1:
console.log("发10个红包");
break;
case 2:
console.log("发5个红包");
break;
case 3:
console.log("没有红包了");
break;
default:
console.log("怎么回事?");
break;
}
整段代码的意思就是,根据grade的值进行分支:
这种逻辑其实用if...else...也可以实现,类似于:
if(grade == 1){
console.log("发10个红包");
}else if(grade ==2){
console.log("发5个红包");
}else if //...
但是switch...case看起来更整洁一些。
另外要注意以下几点:
case grade > 1: //不要这样!会崩
如果两个case之间没有break只有业务逻辑语句,就会出问题(JavaScript莫名其妙,其他语言报编译错误);
如果两(多)个case之间没有任何其他语句,这些case条件构成一种“或”的关系,比如:
switch (grade)
{
case 1:
case 2:
console.log("发5个红包");
break;
case 3:
演示:无论grade等于1或者2,都是输出“发5个红包”
let age /*补足*/;
if(age /*补足*/ 18){
alert(/*补足*/);
}/*补足*/
多快好省!前端后端,线上线下,名师精讲
更多了解 加: