JavaScript 语言精粹 笔记-第二章:语法

163 阅读7分钟

空白

  • 空白主要用于分割字符序列,比如关键字和标识符之间必须有一个空格:var that=this;
  • JavaScript 中有两种注释方式,一种是以两个斜杠 // 开头的单行注释,另一种是用 /* */ 包围的块注释。
    • 在某些情况下,使用块注释可能会出现问题。如下代码块所示,正则表达式中包含的 "*/" 使得原本的 “*/” 不会被当作是注释的结尾,从而导致了语法错误。

       /* 
         var rm_a = /a*/.match(s);
       */
      

      所以,建议在使用注释时优先考虑 //

    注意:注释一定要精确地描述代码

标识符

  • 标识符就是变量、函数、属性或函数参数的名称。它由一个字母、下划线或美元符号开头,其后可选择地加上一个或多个字母、下划线、美元符号或数字,比如:
    abc
    _2a_$
    $6bc$$__3
    
  • JavaScript 规定,保留字不能用作标识符或对象的属性名,因为它们有特殊用途。部分保留字如下:
    abstract 
    boolean break byte 
    case catch char class const continue
    

字面量

  • 字面量就是在代码中直接写出来的值,即字面上的值,并且是固定的,而不是变量,比如:
    100 'abc' [2, 3, 4] { d: 2 }
    

数字

  • JavaScript 的数字类型与 Java 的 double 数字类型一样,内部被表示为 64 位的浮点数。与大部分编程语言不同,JavaScript 只有一个数字类型,没有分离为整数类型,因此 1 和 1.0 的值是相同的,这样的好处就是能够避免短整型的溢出问题。
  • NaN 是一个特殊的数值,它表示一个不能产生正常结果的运算结果,比如 0/0 的结果就是 NaN。NaN 不等于任何值,包括它自己。可以用函数 isNaN(number)检测 NaN。

字符串

  • 字符串字面量采用一对单引号或双引号进行表示。在 JavaScript 中,没有字符类型,若要表示一个字符,只需创建一个只包含一个字符的字符串即可。
  • JavaScript 在被创建的时候,Unicode 是一个 16 位的字符集,所以 JavaScript 中的所有字符都是 16 位的。
  • 要在字符串中插入一些特定的字符,比如反斜线、引号和控制字符,可以使用转义字符
  • 字符串本身不可变,但可以通过 + 运算符拼接其它字符串形成一个新字符串。两个包含着完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串,所以'c' + 'a' + 't' === 'cat'的结果是true
  • 字符串具有一个表示字符串长度的属性length以及一些方法。

表达式

最简单的表达式有:

  • 字面量值(如字符串或数字)
  • 变量
  • 内置的值(true、false、null、undefined、NaN 和 Infinity)
  • 以 new 开头的调用表达式(如 new Object())
  • 以 delete 开头的属性提取表达式(如 delete a.b)
  • 包含在圆括号中的表达式(如 (2 + 3))
  • 以一个前置运算符作为前导的表达式(如 -2 + 3)
  • 以表达式开头,后面跟着:
    • 一个中置运算符与另一个表达式(如 2 + 3)
    • 三元运算符 ? 后面跟着另一个表达式,然后接一个 :,然后再接第三个表达式(2 + 3 === 5 ? 1 : 2)
    • 一个函数调用
    • 一个属性提取表达式(比如 a.b)

运算符优先级从高到低排列如下表所示,其中排在越上面的运算符优先级越高,反之越低。

运算符中文名称
. [] ()提取属性与调用函数
delete new typeof + - !一元运算符
* / %乘法、除法、求余
+ -加法/连接、减法
>= <= > <不等式运算符
=== !==等式运算符
&&逻辑与
||逻辑或
?:三元

注意:在 JavaScript 中,“%”不是通常意义上的模运算,而是“求余”运算。当两个数都为正数时,模运算和求余运算的结果相同;当两个数中存在负数时则不同

语句

  • 语句就是一段可执行的代码,它通过使用一个或多个关键字完成既定的任务。

  • if 语句根据表达式的值改变程序流程,其语法如下:

    if (condition) statement1 else statement2

    condition也就是判断条件,可以是任何表达式。当表达式的值为真时执行跟在其后的代码块,否则,执行可选的 else 分支。当表达式为以下任意一个时,判断结果为假(falsy):

    • false
    • null
    • undefined
    • 空字符串 ''
    • 数字 0
    • 数字 NaN
  • switch 语句类似于 if 语句,也能改变程序流程,其语法如下:

    switch (expression) {
      case value1:
        statement1
        break;
      case value2:
        statement2
        break;
      case value3:
        statement3
        break;
        ...
      default:
        statement
      }
    

    switch 语句会将 expression,即表达式的值,与所有指定的 case 条件进行匹配。

    • 如果没有找到任何匹配,则执行可选的 default 语句。

    • 如果找到一个精确的匹配,会执行匹配的 case 从句中的语句,并继续往下匹配。

    • 如果要防止继续匹配下一个 case,可以在 case 从句中的语句后加上一个强制跳转语句break来退出 switch 语句。

    注意:switch 的表达式可能产生一个数字或字符串。而一个 case 从句包含一个或多个 case 表达式,其中 case 表达式不一定必须是常量,还可以是变量。

  • while 语句执行一个简单的循环。其语法如下:

    while(expression) statement

    如果表达式值为假,就终止循环。反之代码块被执行。

  • do-while 语句类似于 while 语句,其语法如下:

    do { statement } while (expression)

    它和 while 语句唯一的区别就是它不会在代码块执行前检测表达式的值,而是等到代码块执行后才检测。这就意味着代码块至少要执行一次。

  • for 语句是一个结构更复杂的循环语句。它有两种形式。

    • 常见形式的语法如下:

      for(initialization; condition; increment) statement

      initialization 为初始化从句,condition 为条件从句,increment 为增量从句,这三个从句都是可选的。

      在三个从句都不省略的情况下,执行流程如下:

      • 首先,执行 initialization,初始化循环变量。

      • 接着,计算 condition 的值,即检测循环变量是否满足条件。

      • 如果不满足,循环将终止。

      • 否则,执行代码块,然后执行 increment,也就是对循环变量进行某些操作,然后回到第 2 步,继续执行,直到循环结束。

    • 另一种形式(被称为 for in 语句)会枚举一个对象的所有属性名(或键名)。其语法如下:

      for (variable in object) statement

      每次执行循环,都会给 variable 赋予一个 object 的属性作为值,直到 object 的所有属性都被枚举一遍。

      另外,在 JavaScript 中,对象的属性是无序的,也就是说,for-in 语句不能保证对象属性是按照定义时的顺序返回的。

  • try 语句需要搭配 catch 从句使用,其语法如下:

    try { } catch (error) { }

    try 语句执行一个代码块,并捕获该代码块抛出的任何异常。catch 从句必须定义一个错误对象 error,无论是否使用它。

    在 try 代码块中,可以使用 throw 语句抛出一个异常,等 throw 语句执行后,代码会立即退出执行,并跳到 catch 块中。其中,throw 语句的表达式通常是一个对象字面量,它包含一个 name 属性和一个 message 属性。

  • return 语句用在函数中,能让函数提前返回。它可以指定要返回的值,如果没有指定,则返回值是 undefiend

  • break 语句使程序退出一个循环语句或 switch 语句。

函数

  • 函数中可以封装一些代码,在需要的时候可以去调用函数来执行这些代码。

  • 函数可以指定一个参数列表,这些参数就像变量一样,在调用时由实参(argument)初始化。

  • 函数的主体包括变量定义和语句。