JavaScript 基本语法

268 阅读4分钟

表达式与语句

表达式

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

语句

var a = 1 + 3;

上面是一行赋值语句。

二者的区别

  • 表达式一般都有值,语句可能有也可能没有
  • 语句一般会改变环境(声明、赋值)
  • 上面两句话并不是绝对的

大小写

JavaScript 中的大小写敏感,不要写错。

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

空格

大部分空格没有实际意义,var a = 1 和 var a=1 没有区别。

加回车大部分时候也不影响,只有一个地方不能加回车,那就是 return 后面,如果 return 后面不加任何东西,会自动补上 undefined

function fn() {
  return 3
}
fn()  //3
function fn() {
  return
  3
}
fn()  //undefined

标识符

  • 第一个字符,可以是 Unicode 字母、美元符号( $ )、下划线( _ )或中文
  • 后面的字符,除了上面所说,还可以用数字 0-9

下面是一些合法的标识符:

var _tmp = 1
var $elem = 2
var ______ = 6  //虽然合法,但是为了辨认,最多使用两个下划线 '_'
var 你好 = 'hi'

区块 block

JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。

对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。

var a = 1
{
    var a = 2
}
console.log(a)  //2

区块 block 常与 if/for/while 配合使用。

if 结构

if( 表达式 ){
    // 满足条件时,执行的语句1
} else{
    // 不满足条件时,执行的语句2
}

语句1和语句2里都可以嵌套 if else。

{} 在语句只有一句的时候可以省略,但是不建议这样做。省略 {} 时要注意缩进:

var a = 1
if (a === 2)
  console.log('a')
  console.log('a等于2')

上面代码中,输出结果为:a等于2

if...else 结构最推荐使用的写法:

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

if...else 结构次推荐使用的写法:

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

if...else 的三种简写形式

1. 问号冒号表达式 条件 ? 表达式1 : 表达式2

如果“条件”为true,返回“表达式1”的值,否则返回“表达式2”的值。

function max(a, b) {
  return a > b ? a : b  //如果 a > b,返回 a 值,否则返回 b 值
}

2. && 逻辑 A && B && C && D

返回第一个假值或者 D,并不会返回 true/false。

if (window.f1) { console.log('f1存在') }
//简写成 && 逻辑:
window.f1 && console.log('f1存在')

常用写法:

console && console.log && console.log('hi')  // IE 没有 console

3. || 逻辑 A || B || C || D

返回第一个真值或 D,并不会返回 true/false

if (!a) { b } else {}
//简写成 || 逻辑:
a || b

常用写法:

var a = a || 100;  // 100为保底值

whild 循环

while (表达式) { 语句 }
  • 先判断表达式的真假
  • 当表达式为 true,执行语句,执行完再次判断表达式的真假
  • 当表达式为 false,执行后面的语句
var i = 0         //初始化
while (i < 10) {  //判断
  console.log(i)  //循环体
  i = i + 1       //自增
}

会死循环的一个例子:

var a = 0.1
while (a !== 1) {
  console.log(a)
  a = a + 0.1   //a 的值为浮点型,不精确,很难等于1
}

for 循环

for (语句1; 表达式2; 语句3) { 循环体 }
  • 先执行语句1(初始化)
  • 然后判断表达式2(条件)
  • 如果为 true先执行循环体,然后执行语句3(递增表达式)
  • 如果为false,直接退出循环,执行后面的语句

可以省略初始化语句:

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

示例1:

for (var i = 0; i < 5; i++) {
  console.log(i)
}
i  //循环结束后,i = 5

示例2:

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

上面代码中,结果会输出5个5,由于 setTimeout 是异步执行的,所以 for 循环执行结束后(此时 i = 5,见示例1)再执行 setTimeout,且执行五次。

var 改为 let让示例2打印出0,1,2,3,4:

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

break 和 continue

break 会退出当前所有循环:

for (var i = 0; i < 10; i++) {
  if (i % 2 === 1) {
    break;
  }
}  //当i等于1时,跳出循环

continue 语句会退出当前一次循环:

for (var i = 0; i < 10; i++) {
  if (i % 2 === 1) {
    continue  // i 为奇数时跳过
  } else {
    console.log(i)  // i 为偶数时输出
  }
}
// 输出结果
// 0
// 2
// 4
// 6
// 8

标签(label)

JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置。语法如下:

label:
  语句

示例:

foo: {
  console.log(1)
  break foo  //执行到这里就跳出代码块
  console.log('本行不会输出')
}
console.log(2)
// 输出结果
// 1
// 2

值得注意的例子:

{
  foo: 1;
}

上面代码表示:代码块中有一个名为 foo 的标签,其内容为 1,它不是一个对象,而是一个代码块(block)。

JavaScript 相关学习链接

阮一峰 JavaScript 教程

网道 JavaScript教程

《你不知道的 JavaScript (上卷)》,适合进阶