标识符
标识符是在应用程序中,变量取名字时候用到的符号名。变量名就是标识符。
标识符需要遵循的规则:
- 必须以Unicode字母、符号“_”或者符号“$”开头
- 之后的字符可以出现数字
- 需要注意JavaScript是要区分字母大小写的
表达式和语句
定义
表达式
表达式是一组代码的集合,它返回一个值。一般来说,表达式都伴随值或返回值的存在。但这并非绝对的
例如:1+2的表达式的值是3;
add(1,2)表达式的值为函数的返回值(值和返回值不一样,只有函数有返回值);
console.log表达式的值为函数本身;
console.log(3)表达式的值为undefined(函数的表达式的值是返回值,log的返回值是undefined)
语句
语句被称作是流控制语句,通常有标志性的一个或者多个关键字,例如:if 、 while、break、continue、switch等。语句一般会改变环境(声明/赋值)
if语句
if else 语句(如果.....那么.....)
语法
if(表达式){语句1} else{语句2} --意思是:如果表达式成立,那么语句1执行;反之语句2执行
例:
a = 2
if(a = 1){
console.log('假的')
}else{
console.log('真的')
}
变态情况
- a = 1(一个等于号的意思是赋值,三个等于号才是等于的意思)
- 语句1里可以非常变态,如:嵌套的if else;语句2和语句1同理
- 缩进也可以很变态,如
if(a ===2)
console.log('a')
console.log('addd')
这时JS会返回addd,因为if语句默认下一句是带{}的,而再下一句则默认是新的内容,与之前无关
switch 语句(if.....else升级版)
语法
switch (fruit) {
case "bunana":
console.log('banana')
break;
case "apple":
console.log('apple')
break;
default:
console.log('啥也没有')
}
意思是:()里边是主要内容;如果选择banana,会打印banana;如果选apple会打印apple;如果以上两个都没选,会打印“啥也没有”
注意的坑
在绝大部分时候,必须写break,如果不写,则执行完上面内容后还会继续执行下一个任务,而不是出结果
问号冒号表达式(表达式1?表达式2:表达式3)
这种表达式可以理解为简化版的if语句,在没有必要写if语句的情况下,推荐使用
语法
相同内容,用if语句这样写
function max(a,b){
if(a>b)return a;
else return b;
}
用问号冒号表达式这样写
function max(a,b){
return a>b ? a : b
}
&&短路逻辑
这个语句也是用来代替if...else语句的
语法
相同内容,用if语句这样写
if(Window.f1){
console.log('存在')
}
用&&短路逻辑这样写
Window.f1 && console.log('存在')
&&短路逻辑值的特点
- 如果前面为真值,那么就会去求后面的值
- &&值的关系图:如果A为假,则值为A,如果A为真,则值为B
||短路逻辑
用法同&&短路逻辑相反,如果a不是真,则执行b
while、for循环语句
while循环语句
while 循环与 for 循环的功能基本一样,但是while 比较容易出错,所以常用语句还是推荐 for
语法
- while(表达式) {语句}
意思是:如果表达式为真,执行这个语句,执行完再次判断表达式的真假。如果表达式为假,执行这句后面的语句(如果后面没有语句则跳出循环)
例:
var i = 0;
while( i < 10 ){
console.log(i);
i++;
}
注意!
因为 while 的循环需要初始化、判断、循环体、增长四个要素全部正确且合理,否则非常容易进入死循环。
例:
var a=0.1
while(!a==1){
console.log(a)
a=+0.1
}
}
以上代码因为因为浮点数不精确的原因陷入死循环
for 循环
可以看做是while循环的高效写法
语法
- for(语句1;表达式2;语句3){循环体}
意思是:语句1用来初始化,表达式2是用来进行判断的,语句3用来增长。首先执行语句1,之后进行表达式2的判断,如果成立则执行循环体,执行完成后再执行语句3,依次往复
例:
for(var a = 1;a<5;a++){
console.log(a)
}
特例
setTimeout的执行机制会导致输出值发生变化。
因为setTimeout函数的执行机制是是在一定时间后执行func函数,而浏览器会按照顺序执行函数,遇到setTimeout会将func函数放到执行队列中,等到主要函数执行完成后,才开始从执行队列中按照先后顺序取出来func并执行。
例(正常情况):
for(var a = 1;a<5;a++){
console.log(a)
} // 返回值为 0 1 2 3 4
加入setTimeout后:
for(var a = 1;a<5;a++){
setTimeout(()=>{
console.log(a)
},0)
} // 返回值为5 5 5 5 5
想要规避这种情况只需要将var替换成let即可(具体原因不清楚,感兴趣的伙伴可以查查)
例:
for(let a = 1;a<5;a++){
setTimeout(()=>{
console.log(a)
},0)
} // 返回值为 0 1 2 3 4
break和continue
brank
- 退出当前所有循环(当循环嵌套的时候,跳出离break最近的那个循环)
continue
- 退出当前一次循环(如果条件符合,会继续进行下次循环)
lable语句
lable语句可以理解为代码块,相对来说使用范围较小,我们一般情况下很少用到
例:
foo: {
cosole.log(1);
break foo;
console.log('这一行无视掉');
}
console.log(2)
//返回值为1 2
需要注意
lable语句里面内容不一定是一个对象,有可能是一个标签
例
var a = {
foo:1;
}//返回值为1