《JS 语法》

187 阅读4分钟

JS语法

什么是表达式和语句

表达式

表达式一般有值,例如 1+2就是表达式;add(1,2)表达式的值为函数的返回值。只有函数才有返回值。console.log(2)表达式的值为undefined。

语句

语句可能有值,也可能没有值,但是语句一般都会通过声明、赋值等操作改变环境。例如:var a = 1就是语句。

注意事项:

  1. 大小写敏感
  • var a 与 var A 不是一样的
  • object 与Obiect 不是一样的
  • function 与Function 不是一样的
  1. 空格 大部分的空格没有意义

  2. 换行也没有意义,除了return后面。return后面若有换行,就会自动补一个undefined。

var a = 1 与 var a = 1 是一样的。

标识符的规则

  1. 第一个字符为Unicode字母、_、$、中文
  2. 第二个以及之后的字符除了上面的Unicode字母、_、$、中文,之外还可以有数字。

下面为正确的声明:

  1. var a
  2. var _h
  3. var $6
  4. var 中文

条件语句

if else语句

语法:

if(表达式){
        语句1
}else{
    语句2
}

{}可以省略,不建议省略。

变态情况:

  1. 表达式可以非常变态:a=1
  2. 语句1可以非常变态:嵌套if else
  3. 语句2也可以非常变态:嵌套if else
  4. 缩进也可以很变态。

例子:

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。

例子:

  1. 比较a、b的大小
function max(a,b){
    return a>b?a:b
}

这个函数就是比较a和b的大小,a>b吗?大于则返回a,反之返回b。

  1. 取绝对值
function abs(n){
    return n>0?n:-n
}

这个函数的意思是n>0吗?大于则返回n,反之则返回-n。

&&短路逻辑

语法: A&&B&&C&&D 取第一个假值或者前面的不假,就取D。并不会取true/false。

示例图: A&&B

BB
&&
ABB
AAA

例子:

  1. 若f1存在,则打印出“f1存在”
//使用if语句
if(window.f1){
    console.log('f1存在')
}
//使用&&短路逻辑
window.f1&&console.log('f1存在')
  1. 经常使用的一种
console&&console.log&&console.log('hi')

因为IE6里面没有console,所以经常使用上面的代码,意思为:若console存在,则看console.log存不存在,若console.log存在,则执行console.log('hi')

||短路逻辑

语法: A||B||C||D 取第一个真值或者D,并不取true/false。

例子:

  1. 若不是a,就是b
//使用if语句
if(!a){
    b
}else{} //if不等于a,则返回b,反之上面也不做

//使用||短路逻辑
a||b
  1. 保底值
a = a || 100
等价于:
if(a){
    a = a
}else{
    a = 100 //保底值
}

循环语句

while循环

语法: while(表达式){语句}

判断表达式的真假。若为真,则执行语句,结束后判断表达式的真假;若为假,则执行后面的语句。

变型:do.....while

变态情况:

  1. 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

  1. 死循环
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;若为假,则直接退出循环,执行后面的语句。

例子:

  1. 下面循环结束之后,i的值为多少?
for(var i = 0; i<5; i++){
    console.log(i)
}

打印结果为0,1,2,3,4,结束循环之后i的值为5

  1. 执行以下代码之后,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:退出当前所有循环

例子:

  1. 打印出i的值
for(var i = 0; i<10; i++){
    if(i%2 === 1){
        break
    }
}

打印结果为i=1

  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:退出当前一次循环

例子:

  1. 打印出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.