JS 基本语法

1,350 阅读4分钟

这篇文章开始,我们来对 JS 知识做一些总结。我们首先来看看 JS 的基本语法。

表达式与语句

表达式

表达式是一组代码的集合,它返回一个值。接下来我们来举例说明

  • 1 + 2 表达式的值为 3
  • add(1, 2) 表达式的值为函数的返回值
  • console.log 表达式的值为函数本身
  • console.log(3) 表达式的值 为 undefined ,打印 3 ,不代表返回值。

问号冒号表达式(三元运算符)

语法:表达式1 ? 表达式2 : 表达式3

n > 0 ? n :-n

&& 短路逻辑

A && B && C && D 取第一个假值或 D,并不会取 true / falsewindow.f1 && console.log('f1存在') 取值为 undefined

|| 短路逻辑

A || B || C || D 取第一个真值或 D 。a = a || 100 这个表达式取不到值,程序会报错,因为 a 没有被创建。

语句

var a = 1 是一个语句

二者的区别

  1. 表达式一般都有值,语句可能有也可能没有
  2. 语句一般都会改变环境(声明,赋值)

注意:上面两点不是绝对的

大小写敏感

  • var a 和 var A 是不同的
  • object 和 Object 是不同的
  • function 和 Function 是不同的

空格

大部分空格没有实际意义,var a = 1 和 var a=1 没有区别,加回车大部分时候也不影响,只有一个地方不能加回车,那就是 return 后面。

return 加回车,会在 return 后面自动补充一个 undefined,return undefined。

标识符

标识符就是代码中用来标识变量、函数、或属性的字符序列。

规则

第一个字符,可以是 Unicode 字母或 $ 或 _ 或中文,后面的字符,除了前面所说,还可以有数字。

举例:

  • var _ = 1
  • var $ = 2
  • var ____ = 6
  • var 你好 = 'hi'

if 语句

语法

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

{} 只在第一句的时候可以忽略,不建议这样做。

特殊情况

  • 表达式可以是 a = 1
  • 语句 1 和语句 2 里可以嵌套 if...else
  • 不带{}时,缩进需要注意,只有第一行代码属于 if...else 的执行语句

写法

最推荐写法

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

次推荐写法

function fn() {
    if (表达式) {
        return 表达式
    }
    if (表达式) {
        return 表达式
    }
    return 表达式
}

switch 语句

语法

switch (fruit) {
    case "banana":
        // ...
        break;
    case "apple":
        // ...
        break;
    default:
        break;
}

在 JS 中,switch 语句如果不添加 break 关键字,会造成事件穿透,开发中不推荐使用。

while 语句

语法

while (表达式) {语句}

执行流程:判断表达式的真假

  1. 当表达式为真,执行语句,执行完再次判断表达式的真假
  2. 当表达式为假,执行后面的语句

特殊举例:

let a = 0.1;
while (a !== 1) {
    console.log(a);
    a = a + 0.1;
}

这个例子会进入死循环,原因是因为浮点数运算,可能丢失精度。

for 循环

实际上 for 循环就是一个语法糖,是 while 循环的方便写法。

语法

for (语句1; 表达式2; 语句3) {
    循环体
}

执行流程:先执行语句 1,然后判断表达式 2。

  1. 如果为真,执行循环体,然后执行语句 3。
  2. 如果为假,直接退出循环,执行后面的语句。

特殊举例:

for (var i = 0; i < 5; i++){
    setTimeout(() => {
        console.log(i);
    }, 0);
}

这个例子,结果会打印 5 个 5。

原因:循环执行结束,i == 5 ,延迟打印 i 的值为 5。与 var 的提升有关。

上述代码可以变形为:

var a = 1;
function fn() {
    console.log(a);
}

打印值取决于函数什么时候调用,我们开始一个延迟函数 setTimeout(fn) ,a = 5,打印出 5 。

如果我们将 var 替换为 let ,则会以此打印 0 1 2 3 4 。

break 和 continue

break 为退出所有循环,continue 为退出当前一次循环。

注意:break 只退出离得最近的循环

label

label 为标记语句,可以和 breakcontinue 语句一起使用。

语法

foo: {
    cosole.log(1);
    break foo;
    console.log('本行不会输出');
}
console.log(2)

通过 label 的这种语法,我们可以做到让多层循环内的最里层循环执行 break label来退出指定层循环。

注意:{foo: 1} 在浏览器中,这就是一个标签,值为 1。只有 var a = {foo: 1} 时,才是一个对象。