JS语法
什么是表达式和语句
表达式
表达式一般有值,例如 1+2就是表达式;add(1,2)表达式的值为函数的返回值。只有函数才有返回值。console.log(2)表达式的值为undefined。
语句
语句可能有值,也可能没有值,但是语句一般都会通过声明、赋值等操作改变环境。例如:var a = 1就是语句。
注意事项:
- 大小写敏感
- var a 与 var A 不是一样的
- object 与Obiect 不是一样的
- function 与Function 不是一样的
-
空格 大部分的空格没有意义
-
换行也没有意义,除了return后面。return后面若有换行,就会自动补一个undefined。
var a = 1 与 var a = 1 是一样的。
标识符的规则
- 第一个字符为Unicode字母、_、$、中文
- 第二个以及之后的字符除了上面的Unicode字母、_、$、中文,之外还可以有数字。
下面为正确的声明:
- var a
- var _h
- var $6
- var 中文
条件语句
if else语句
语法:
if(表达式){
语句1
}else{
语句2
}
{}可以省略,不建议省略。
变态情况:
- 表达式可以非常变态:a=1
- 语句1可以非常变态:嵌套if else
- 语句2也可以非常变态:嵌套if else
- 缩进也可以很变态。
例子:
a = 1
if(a === 2)
console.log('a')
console.log('a等于2')
打印出什么?——答:a等于2
a = 1
if(a === 2)
console.log('a');console.log('a等于2')
打印出:a等于2
a = 1
if(a === 2)
console.log('a'),console.log('a等于2')
打印出:什么都没有,因为if语句只影响一句。分号结束之后或者换行之后就不会影响后面的表达式。
所以最推荐的写法是:
if(表达式){
语句
}else if(表达式){
语句
}else{
语句
}
function fn(){
if(表达式) {
return 表达式
}
if(表达式) {
return 表达式
}
return 表达式
}
switch语句
语法:
switch (fruit) {
case "banana":
//....
break;
case "apple":
//...
break;
default:
//...
}
注意: break不能省略,否则会出错。这个就是switch这个语句设计不好的地方。
问号冒号表达式
语法: 表达式1?表达式2:表达式3
这是简化版的if,一般我们都喜欢使用这个表达式来替换if else表达式。其含义是:执行表达式1,若返回值为真,则执行表达式2,反之则执行表达式3。
例子:
- 比较a、b的大小
function max(a,b){
return a>b?a:b
}
这个函数就是比较a和b的大小,a>b吗?大于则返回a,反之返回b。
- 取绝对值
function abs(n){
return n>0?n:-n
}
这个函数的意思是n>0吗?大于则返回n,反之则返回-n。
&&短路逻辑
语法: A&&B&&C&&D 取第一个假值或者前面的不假,就取D。并不会取true/false。
示例图: A&&B
B | B | |||
---|---|---|---|---|
&& | 真 | 假 | ||
A | 真 | B | B | |
A | 假 | A | A |
例子:
- 若f1存在,则打印出“f1存在”
//使用if语句
if(window.f1){
console.log('f1存在')
}
//使用&&短路逻辑
window.f1&&console.log('f1存在')
- 经常使用的一种
console&&console.log&&console.log('hi')
因为IE6里面没有console,所以经常使用上面的代码,意思为:若console存在,则看console.log存不存在,若console.log存在,则执行console.log('hi')
||短路逻辑
语法: A||B||C||D 取第一个真值或者D,并不取true/false。
例子:
- 若不是a,就是b
//使用if语句
if(!a){
b
}else{} //if不等于a,则返回b,反之上面也不做
//使用||短路逻辑
a||b
- 保底值
a = a || 100
等价于:
if(a){
a = a
}else{
a = 100 //保底值
}
循环语句
while循环
语法: while(表达式){语句}
判断表达式的真假。若为真,则执行语句,结束后判断表达式的真假;若为假,则执行后面的语句。
变型:do.....while
变态情况:
- i为0,当i<10的时候打印i,并i+1,最后在Chrome上运行会多出一行10
var i = 0
while(i<10){
console.log(i)
i++
}
打印结果为:0,1,2,3,4,5,6,7,8,9,最后在Chrome上运行会多出一行10
- 死循环
while(true){} //死循环
var a = 0.1 //初始化
while(a!==1){ //判断
console.log(a) //循环体
a = a + 0.1 //增长
}
已上代码不会循环,会进入死循环,因为浮点数不精确,导致a在0.99999....的时候直接跳过了1,到1.00000000009009999.....,永远不等于1。所以会死循环。
for循环
for是while的语法糖,是升级版本,避免了死循环。
语法:
for(语句1;表达式2;语句3){
循环体
}
//语句1为初始化
//表达式2为判断
//语句3为增长
其含义为先执行语句1,再判断表达式2,若为真,则执行循环体,然后再执行语句3;若为假,则直接退出循环,执行后面的语句。
例子:
- 下面循环结束之后,i的值为多少?
for(var i = 0; i<5; i++){
console.log(i)
}
打印结果为0,1,2,3,4,结束循环之后i的值为5
- 执行以下代码之后,i的值为多少?
for(var i = 0; i<5; i++){
setTimeout(() => {
console.log(i + '随机数' + Math.random())
},0)
}
打印结果为:5个“5+随机数”。如果把var改为let就正常打印了0,1,2,3,4。
break和continue
break:退出当前所有循环
例子:
- 打印出i的值
for(var i = 0; i<10; i++){
if(i%2 === 1){
break
}
}
打印结果为i=1
- break退出最近的循环
for(var i = 0; i<10; i++){
for(var j = 101; j<110; j++){
if(i === 5){
break
}
}console.log(i)
}
打印结果为5。
continue:退出当前一次循环
例子:
- 打印出i的值
for(var i =0; i<10; i++){
if(i%2 === 1){
continue
}else{
console.log(i)
}
}
打印结果为0,2,4,6,8
label语句
语法:
foo: {
console.log(1);
break foo;
console.log('本行不会输出');
}
console.log(2);
变态情况:面试会问
{
foo:1
}
返回为1,有个代码块,里面有一个foo,值为1.