一. 表达式与语句
1.表达式
- 1+2表达式的值为3
- add(1,2)表达式的值为函数的返回值(只有函数有返回值!)
- console.log表达式的值就是函数本身,即console.log表达式的值就是console.log,console.log是一个函数
- console.log(3)表达式的值是undefined,不是3,因为console.log()函数的返回值就是undefined!
- 值、返回值、打印出来的数要区分开
2.语句
比如let a = 1;是一个语句
3.表达式和语句的区别
- 一般来说,表达式会产生一个值,可用作一个函数调用的参数,可以放在需要值的地方
- 语句强调一个行为,一般会改变环境(声明、赋值等),可能有值也可能没有值,一个程序由一系列语句组成.不能在一个需要表达式的地方放一个语句.比如,一个if语句不能作为一个函数的参数.
- 以上情况都不是绝对的
二. 标识符的规则
- 标识符的第一个字符可以是Unicode字母、$、_或中文(下划线最多两个)
- 非首字符除了上面这些还可以是数字,数字不能是首字符
- 变量名是标识符
√ let 嘿嘿嘿 = 1
√ let a = 2
√ let Ω = 3
√ let $1 = 4
√ let _yyy = 'hello'
三. if else 语句
- 基本语法
if(表达式){
语句1
} else {
语句2
}
- 若{}中语句只有一句时,{}可以省略,但是不建议这么做!!!
例子如下:
let a = 3
if(a < 100)
if(a < 10)
console.log('a小于10')
let b = 1
if(b === 2)
console.log('b')
console.log('b等于2')
//结果为输出"b等于2"
//因为没有加花括号的情况下if只判断后面第一个语句,判断不满足后跳出判断,并执行下一个语句
- 基本语法中的语句1和语句2可以有多层嵌套,可以是任何合法语句.
else if的由来举例如下:
let a = 999
if(a<100){
console.log("a小于100")
}else{
if(a>10000){
console.log("a大于10000")
} else{
console.log("100<=a<=10000")
}
}//第一组
let a = 999
if(a<100){
console.log("a小于100")
}else if(a>10000){
console.log("a大于10000")
} else{
console.log("100<=a<=10000")
}//第二组,省略了第一层else后面的{}
结果为100<=a<=10000.
第一组等同于第二组,省略了else的一组花括号直接变成了else if!!!
else if不是本来就有的,是在else里嵌套了另一组if else语句时,省略了外层else后的花括号得来的,例子如上!
四.switch case 语句
- 基本语法
switch(fruit){
case "banana":
...
break
case "apple":
...
break
default:
...
}
PS:
1.大部分时候,不要省略break,不要省略break,不要省略break
2.少部分时候,可以利用break
3.在迫不得已的时候使用switch case语句
五. 问号冒号表达式
常用于简化if中只有一个语句,else中也只有一个语句的情况
- 基本语法
表达式1?表达式2:表达式3
//表达式1满足吗?满足执行表达式2,不满足执行表达式3
- 举例
//返回a和b中的最大值
function max(a,b){
return a>b ? a : b
}
//等价于以下
function max(a,b){
if(a>b){
return a
}else{
return b
}
}
六. &&短路逻辑、||短路逻辑
- 两个短路逻辑都不会取true和false
- A && B && C && D : 取第一个假值 或者 最后一个D
- A || B || C || D : 取第一个真值 或者 最后一个D
七. while 循环
- 基本语法
while(表达式){
语句
}
Step:
1.判断表达式的真假.
2.当表达式为真 : 进入while循环 , 执行语句 , 执行完语句再判断表达式的真假.
3.当表达式为假 : 跳出while循环 , 执行while循环外的后面其他语句.
PS : 若表达式一直为真,则while进入死循环. 如while(true){}就是一个死循环!
以下为一个死循环的例子,死循环原因是浮点数相加不精确,有可能a加0.1后一直不等于1:
let a = 0.1
while(a!==1){
a = a + 0.1
}
八. for 循环
for循环是while循环的方便写法 , 两种写法可以相互转换.
- 基本语法
for(语句1;表达式2;语句3)
{
循环体
}
Step:
1.执行语句1.(语句1用于初始化,只执行一次)
2.判断表达式2是否为真.
3.当表达式2为真 : 执行循环体 , 执行完循环体再执行语句3 , 执行完语句3再判断表达式2是否为真.
4.当表达式2为假 : 跳出for循环 , 执行for循环外的后面其他语句.
PS : 表达式2和语句3都不可以不写,不写会进入死循环!
- 变态的例子
for(let i=0;i<5;i++){
console.log(i)
}
//结果为分别打印出0,1,2,3,4 , 且i最终的值等于5
//因为循环体之行为之后需要执行一次i++再判断i<5
for(var i=0;i<5;i++){
setTimeout(()=>{
console.log(i)
},0)
}
//结果为分别打印出5个5
//因为循环执行完毕后i的值为5,setTimeout函数的意思是过一会再执行,且setTimeout执行了5次,完成循环的时间比setTimeout的时间短
//只有在var的时候会打5个5,如果用let就分别打印0,1,2,3,4
九. break和continue
break : 退出所有循环 , 且只会退出离它最近的一层循环.
continue : 退出当前一次循环.
- break举例
//第一个例子
for(let i=0;i<10;i++){
for(let j=101;j<110;j++){
if(i===5){
break
}
}
console.log(i)
}
//结果为分别打印出0到9,不会在5时中断!
//因为break只会退出离它最近的for,即退出for(let j=101;j<110;j++){}循环,对外层的循环没有影响
//第二个例子
for(let i=0;i<10;i++){
if(i%2===1){
break
} else {
console.log(i)
}
}
//结果为只打印一个1,当i等于1时跳出整个for循环
- continue举例
for(let i=0;i<10;i++){
if(i%2===1){
continue
} else {
console.log(i)
}
}
//结果为打印出0,2,4,6,8
//当i为奇数时跳过这次循环,continue可以理解成斗地主的过或者英文的next
十. label
(面使可能用,平时没什么用处)
- 基本语法
//第一个例子
foo: { //有一个叫foo的标签,标签里有如下代码块
console.log(1);
break foo; //跳出foo标签
console.log('本行不会被输出');
}
console.log(2);
//结果为输出1和2
//第二个例子
{
foo:1;
}
//结果为1
//有一个代码块,代码块里有个foo标签,foo标签里只有一个1
//第三个例子
let a={
foo:1;
}
//结果为undefined
//此时a为一个对象,意思是a是一个lable,语句是一个1