引
程序猿买西瓜
老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门。老婆怒道:“你怎么就买了一个包子?!”老公答曰:“因为看到了卖西瓜的。”
此段子的出现出一度刷爆了程序猿们的朋友圈,将我等码农呆瓜,木纳的本质表现的淋漓尽致,不可谓不妙,究其原因,是因为这个倒霉的小哥分析需求时不细致。
老婆的意思,应该是这样:
买一斤包子
if (看到卖西瓜的){
买一个西瓜
}
可是小哥理解成:
let n = 1斤
if (看到卖西瓜的){
n = 1
}
买n份包子
如此理解,人不被打死,键盘也得跪坏了。 那么在这里,有我们本次要学习的概念,条件执行,更专业的说话,叫做 控制流。
程序就是一系列指令。但编程真正的力量不仅在于运行(或“执行”)一条接一条的指令,就像周末的任务清单那样。根据表达式求值的结果,程序可以决定跳过指令,重复指令,或从几条指令中选择一条运行。实际上,你几乎永远不希望程序从第一行代码开始,简单地执行每行代码,直到最后一行。“控制流语句”可以决定在什么条件下执行哪些语句。
在javascript 里,控制流主要有if ,if-else,switch 这三种种结构。
tips 需求————程序员们编程时时要完成的任务。
if
if的语法定义如下:
if (条件)
语句A
即,当条件为真时,会执行语句A。 试试下面的程序:
let a = 1
if (a > 0)
consol.log('a > 0')
写到这,我们要重点介绍一下javascript 里的boolean类型与表达式
boolean 类型和string等数据类型一样,是我们各种数据类型中的一种,但是他只有两种类型,真和假,即true 和 flase,我们可以直接以常量的形式进地赋值。
let true_val = true
let false_val = false
console.log(true_val)
console.log(false_val)
但是显然这些东西并没有什么真正的实用价值 ,我们要进行判断时,这个值是通过一系列的表达式计算出来的。
表达式的百度定义如下:
表达式 表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值。
简单来讲,表达式就是一系列常量,变量,操作符的组合,他们通过一系列的计算,会得到一个确定的值.
常量,变量,我们之前已经介绍过了,那么操作符是什么呢,简单讲,操作符可以将两个或多个确定值联在一起,返回一个新的确定值,对,加,减,乘,除就是其中一种。我们之前用的将两个字符串拼到一起的+也是操作符。
javascript中操作符主要有:
标准数学操作符,+,-,*(乘),/(除)
%取模——一个非常有意思的操作符,a%b表示的是 a除以b得到余数,如
100 % 100 = 0 11 % 7 = 4
tips 理解取模操作是编程入门一个非常重要的过程。
各种比较运算,如>, >=, <, <= 这些值会返回真或假,也就是boolean值。
三元操作符a?b:c,这个的意思是,如果a为真,则返回b的值,否则返回c的值。
非常重要的bool操作符, 有一元操作符,非(!),即 !false 是 true,!true是false, 还有且(&&,对,就是and),或(|| or),这些操作符的参考可以如下:
// !运算 ! true -> flase ! false -> true //&& 运算 true && true -> true true && false -> false false && true -> false false && false -> false //||运算 true || true -> true true || false -> true false || true -> true false || false -> true
简单来说,当a,b都为true,a&&b才为true,否则为false ,当a,b都为flase时,a||b为false ,否则为true
嗯,还有 相等 (=\==) 和不等 (!==),
1 === 1 -> true 1 === 9 -> false 1 !== 1 -> false 1 !== 9 -> true
其实相等分为相等(==)和全等(=\==)两种,不等也是类似 (!= 和 !=\=),为了不塞太多,我们只讨论前两者。
同时,javascript 中的表达式也是支持括号来约束优先级的,如:
(1>2)&&(4<=4)
(!true)||('hello'=='Hello')
有了表达式,我们可以通过上述的 if 判断去实现自己的逻辑了。 如,随机取一个 0到1之间的数,如果比0.5大,就输出:
let r = Math.random()
if(r>0.5){
console.log('r>0.5')
}
这里面用了 javascript的标准库 Math, Math 里有很多现成的与数学有关的函数,可以参考课后的连接。。
注意,同时,在上面的语句里,我们还用到了{ } ,这里, {} 内的语句表示一起执行。
试验一下如下语句的区别。
A
let r = Math.random()
if (r>0.5){
console.log('r>0.5')
console.log(r)
}
B
let r = Math.random()
if (r>0.5){
console.log('r>0.5')
console.log(r)
}
当 if 后只需要执行一条语句时,其实加不加{} 是相同的,但是为了代码的可读性,我们还是习惯加上,也就是说。
let r = Match.random()
//这种写法很好
if ( r> 0.5){
console.log('r>0.5')
}
//这么写会被 diss
if (r>0.5)
console.log('r>0.5')
if - else
与 if 的定义类似,if-else 的定义是
if (条件) A else B
即,如果条件为真,则执行语句 A,否则执行语句 B ,像是这样。
let r = Math.random()
if (r>0.5){
console.log('r>0.5')
}else{
console.log('r<=0.5')
}
语句和语句之间自然是可以组合嵌套的,所以,我们会有类似的代码:
let name = "jin"
if (name === "jin"){
console.log("this is jin")
}else {
console.log("oh ,not jin")
if(name ==="ge"){
console.log("this is ge")
}else {
console.log("code.")
}
}
switch
除了 if ,条件判断还有 switch 这种格式,定义类似于:
switch(表达式){
case 值1:
语句
break
case 值2:
语句
break
......
default:
语句
break
}
即,当表达式为对应 case 某个值时,执行相应的语句,否则执行 default 内的语句。 例:
let name = 'hello'
switch (name){
case 'ge':
console.log('a coder')
break
case 'lu':
console.log('interpreter')
break
default:
console.log('not us')
break
}
作业
计算从现在开始的n天内有几个星期天
考试的分数是百分制,都为整型,60以下不及格,60-80为良好,80-100为优秀,100分为完美。写程序生成一个随机分数,用一行信息输出 '分数值为: ,评价为:'的信息
下面的代码有什么问题?
let r = Match.random() if(r>0.5){ console.log('r>0.5') }else if (r>0.4){ console.log('r>0.4') }else { console.log('r is not needed') }
随机生成一个以秒为单位的时间截,并把这个时间按小时:分:秒来进行显示。
扩展&自学 javascript 里有一个神奇的常量,叫 undefined . 尝试如下代码:
let c console.log(c) if (!c){ console.log('!c is true??') } if (c === undefined){ console.log('c is undefined') }
学习与 undefined 有关的内容
参考
javascript 的 math 库 :http://www.w3school.com.cn/jsref/jsrefobjmath.asp