变量

var num; // undefined
let num1, num2; // 声明多个变量

注:let 为 ES6 新增。

常量

const num = 42

虽然 const 关键字限定了栈上的内容不可编辑,但堆上的内容可以编辑,因此对于引用类型来说,要使堆上的内容不可编辑,需要额外使用 readonly 关键字:

const object1 = { property1: 1 };
const array1 = ["a", "b", "c"]
object1.property1 = 2;
array1[1] = "x";

注:const 为 ES6 新增。

命名

  • 可以以任意 Unicode 字母(含中文),以及美元符号($)和下划线(_)开头。
  • 非开头可以使用数字

注释

// 单行注释由两个左斜杆组成
 
/* 多行注释
   由星号和左斜杆组成 */

JavaScript 同样支持 HTML 风格注释 <!-- HTML 风格注释 JS 版本

运算符

赋值

  • 赋值:=
  • 先加后赋值:+=
  • 先减后赋值:-=
  • 先乘后赋值:*=
  • 先除后赋值:/=

算术运算符

  • 加减乘除:+, -, *, /
  • 取模(余数):%
  • 取幂:**
  • 自增:++
  • 自减:--

自增和自检用在变量前是返回自增之后的值,用在变量之后将返回自增前的值。

字符串运算符

  • 连接两边的字符串:+
  • 拼接字符串后在赋值给左侧变量:+=

比较运算符

  • 相等和不等:== !=
  • 绝对相等和不等:=== !==
  • 大于和小于:> <
  • 大于或等于:>=
  • 小于或等于:<=

===!== 除了比较值之外,还对类型进行比较。

一元运算符

  • -:负号
  • +:加号,连接运算符
  • typeof:(typeof num) // 输出:number
  • instanceof:判断对象是否是指定的类型,obj instanceof number(类似 Python isinstance() 方法)

三元运算符

  • condition ? expr1 : expr2
    • expr1:condition 为 True 时执行
    • expr2:condition 为 False 时执行

逻辑运算符

  • and:&&
  • or:||
  • not:!

类型运算符

  • 返回变量类型:typeof
  • 检查变量是否为指定类型:instanceof

流程控制

条件语句

if

const count = 42;
 
// 单行
if (count == 42) console.log("42")
 
if (count == 3){
    // count 是 3 时执行
} else if (count == 4){
    // count 是 4 时执行,可以有多个
} else {
    // 其他情况下执行 
}
 

switch

当执行语句有多行时,可以使用花括号标记范围,另外每个语句最后如果没有 break 语句,则会继续执行。

let today = 6
 
switch (today) {
    case 1:
        console.log("星期一");
        break;
    case 2:
        console.log("星期二");
        break;
    case 6: {
        console.log("星期六");
        console.log("今天是休息日");
    }
        break;
    case 7: {
        console.log("星期日");
        console.log("今天是休息日");
    }
        break;
}

另外 switch 语句中可以使用 default 关键字设定一个默认分支:

let today = 996;
switch (today) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        console.log("工作日");
        break;
    case 6:
    case 7:
        console.log("休息日");
        break;
    default:
        console.log("此星期不存在!");
        break;
}

循环语句

  • break:跳出循环;
  • continue:跳过当前循环

for 循环

for (初始化语句; 条件; 递增表达式)
  语句
 
// 或者
for (let i = 0; i < 5; i++){
    console.log('i 当前为:' + i);
}
  • 初始化:初始值,在循环开始之前执行的代码;
  • 条件:每轮循环开始都执行一次,为 true 才继续;
  • 递增语句:循环的最后一个操作,通常用于递增变量

初始化语句和递增表达式都可以省略:

let i = 0
for (; i < 4; ) {
    i++;
}

所有 for 循环都可以改成 while 循环。

while 循环

// 单行
while (true) console.log('无限循环');
 
while (true) {
    // 无限循环
}
 
let i = 0;
while (i < 100) {
  console.log('i 当前为:' + i);
  i = i + 1;
}

do while 循环

do while 是 while 循环的变体,循环至少会执行一次。

do {
    console.log("executed!"); //输出"executed!"
}
while (false);

数据类型

  • 原始类型:
    • boolean:布尔值
    • number
    • bigint
    • string
    • any
    • unknown
    • never
  • 引用类型(复合)
    • array:数组
    • tuple:元组
    • function:函数
    • object:对象
    • class:类型
  • 进阶类型
    • 泛型
    • 类型别名
    • 联合类型
    • 交叉类型

  • 联合类型写法:string | number

原始数据类型

通常,数值、字符串、布尔值这三种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefined和null,一般将它们看成两个特殊值。

TS 原始数据类型为 JS 的小写形式:

原始数据类型JavaScriptTypeScript
字符串Stringstring
数值Numbernumber
布尔值Booleanboolean
大整数BigIntbigint
符号Symbolsymbol
不存在Nullnull
未定义Undefinedundefined
// 字符串
const str: string = 'Hello'
// 字符串类型推导
const str = 'Hello'

ES6 新增两种类型:

  • BigInt
  • Symbol

TS 独有的三种特殊类型:

  • any
  • unknown
  • never

字符串

字符串拼接的几种方式:

// 反引号
const number = 42
const luckyNumber = `我的幸运数字:${number}`