JavaScript语法

94 阅读5分钟

书写

  • 大小写 敏感,aA是不同的
  • 空格 无实际意义,大部分并不影响书写,书写注意不要影响机器识别。例如单词与单词间的空格
  • 回车 大部分并不影响书写,但在return后面加回车例外,不要在return后面加回车
  • 注释
    • 单行注释,用//起头;
    • 多行注释,注释内容放在/* */里面。

语句和表达式

  • 语句(statement):是为了完成某种任务而进行的操作。例如:
var a = 1 + 3;

这条语句先用var命令,声明了变量a,然后将1 + 3的运算结果赋值给变量a

  • 表达式(expression):指一个为了得到返回值的计算式。上面例子中1 + 3就叫做表达式。

    • 1+2表达式的值是3
    • add(1,2)表达式的值是函数的返回值
    • console.log(3)的值是undefined,因为返回值是undefined
    • console.log()的值是其本身
  • 语句和表达式的区别

    • 前者主要为了进行某种操作,一般会改变环境(声明、赋值)。一般情况下不需要返回值;后者则是为了得到返回值,一定会返回一个值。

标识符

  • 标识符(identifier)指的是用来识别各种值的合法名称。
  • 标识符的命名规则:
    • 第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母)、美元符号$、下划线_以及中文
    • 后面的字符,除了上述合法字符外,还可以用数字
合法的标识符:
arg0
_tmp
$elem
π
var 临时变量 = 1;

不合法的标识符:
1a  // 第一个字符不能是数字
***  // 标识符不能包含星号
a+b  // 标识符不能包含加号
-d  // 标识符不能包含减号或连词线

区块

  • JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
{
let a = 1
let b = 2
}
  • 对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。
{
  var a = 1;
}

a // 1

上面代码在区块内部,使用var命令声明并赋值了变量a,然后在区块外部,变量a依然有效,区块对于var命令不构成单独的作用域,与不使用区块的情况没有任何区别。在 JavaScript 语言中,单独使用区块并不常见,区块往往用来构成其他更复杂的语法结构,比如forifwhilefunction等。

条件语句

JavaScript 提供if结构和switch结构,完成条件判断,即只有满足预设的条件,才会执行相应的语句。

if 语句

语法

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

在函数里使用if语句

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

特殊情况:

  • {}在只有一个语句时可以省略,注意是一个语句而不是一行!
  • 省略加缩进 1660405756219.png

switch 语句

  • 多个if...else连在一起使用的时候,可以转为使用更方便的switch结构。

语法

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

例如:

switch (x) {
  case 1:
    console.log('x 等于1');
    break;
  case 2:
    console.log('x 等于2');
    break;
  default:
    console.log('x 等于其他值');
}

每个case都需要写一个break,不然,如果banana没有break, 那么它会继续执行apple的部分,直到碰到了Break

问号冒号表达式:

  • 表达式1 ? 表达式2 : 表达式3
  • 例如:
funtion max(a,b) {
  if(a>b) return a;
  else return b;
}

可以写成:

funtion max(a,b) {
  return a>b ? a : b
}

$$ 短路逻辑

  • A && B && C && D : 取第一个假值 或者 D;并不会取true/false
  • 例如:
if (window.f1) {
    console.log('f1存在')
}

可以写成:

window.f1 && console.log('f1存在')

|| 短路逻辑

  • A || B || C || D:取第一个真值 或者 D;并不会取true/false
  • 例如:
if (a) {
 a = a
} else {
 a = 100    //保底值
}

//如果a存在就a=a, 如果a不存在, a=100

可以写成:

a = a || 100
  • 例如:
if(!a) {
  b
}

可以写成:

a||b

循环语句

while 循环

语法

while (表达式) {
  语句;
}
  • While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。
    • 判断表达式真假;
    • 为真,执行语句,执行后再判断表达式的真假;
    • 为假,结束循环,执行后面其他的语句。
  • while语句的循环条件是一个表达式,必须放在圆括号中。代码块部分,如果只有一条语句,可以省略大括号,否则就必须加上大括号。

特殊情况:

  • 情况1: 1660408088298.png 正常应当输出0-9。但是在Chrome或是Edge上却是0-10。10并非正常会出现的,不知道为啥。
  • 情况2:
let a = 0.1;
while (a !== 1) {
    console.log(a)
    a = a + 0.1
}

由于浮点数的计算是不精确的,所以上述代码会死循环。(如下图所示)

1666063282685.png

while (true) {
  console.log('Hello, world');
}

这也是一个无限循环,因为循环条件总是为真。

for 循环

语法糖 : for循环是while循环的方便写法

语法

for (语句1 ;表达式2 ;语句3) {
  循环体
}
  • 先执行1,然后判断2
  • 2为真,执行循环体,再执行3
  • 2为假,直接退出循环,执行后面其他的语句

例如:

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

1666063565482.png

console.log(i)在这里打印出的是0,1,2,3,4 。最终i 的值是 5 , 因为当i == 4, i = i + 1 = 5, 然后退出循环

特殊情况:

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

会打印出5次5

我们已经知道for (var i = 0; i < 5; i++) {}执行完毕后,i的值是5。setTimeout是过一段时间执行, 而for循环是当前任务,所以这段代码意思就是说等到for循环执行完毕了,再打印5次i,所以就会打印5个5。

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

当把var 换成 let, 就会打印出 0, 1, 2, 3, 4。因为 for循环 在用 let 时有单独逻辑。

break 和 continue

  • break:退出所有循环(指的是所在的离自身最近的for循环不再执行了)
  • continue:退出当前一次循环
for (var i = 0; i < 10; i++) {
    for (var j = 0; j < 5; j++) {
        if (i===5) {
            break;
        }
    }
    console.log(i)
}

会打印出0,1,2,3,4,5,6,7,8,9。因为break只会退出和他最近的一个for循环

for (var i = 0; i < 10; i++) {
    for (i%2 === 1) {
      continue
    } else {
      console.log(i)
    }
}

会打印出0,2,4,6,8。(i%2 === 1表示 i 除以2余数为1得数,即单数)

label 标签

  • JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。
label:
  语句
  • 标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。
  • 标签通常与break语句和continue语句配合使用,跳出特定的循环。
foo: {
  console.log(1);
  break foo;
  console.log('本行不会输出');
}
console.log(2);

foo 表示 label的标识符是 foo,break foo 表示退出当前的Label, 所以代码会输出 1 ,2

1666063976770.png

  • 特殊例子:
{
  foo:1;
}

上述的代码表示:有一个代码块,代码块里有一个label标签foo, 标签的内容是 1

上述代码不是一个对象!


「资料来源:饥人谷、[JavaScript的基本语法-wangdoc.com](https://wangdoc.com/javascript/basic/grammar.html)」