1.1 JavaScript 回顾
1.1.1 变量和数据类型
JavaScript 是一种动态类型语言,它使用变量来存储和操作数据。在 JavaScript 中,变量是通过关键字var
、let
或const
来声明的。数据类型在 JavaScript 中分为两大类:原始数据类型和引用数据类型。
原始数据类型(Primitive data types)包括:
true
和false
。42
、3.14
等。"Hello World"
、'JavaScript'
等。引用数据类型(Reference data types)包括:
{ name: 'John', age: 30 }
。[1, 2, 3, 4]
。function add(a, b) { return a + b; }
。在 JavaScript 中,变量的数据类型是动态的,也就是说可以在运行时改变一个变量的数据类型。例如,一个变量一开始可以是一个数字,然后在后续代码中被赋值为字符串。变量的数据类型可以使用typeof
运算符来检测。
下面是一些关于变量和数据类型的示例代码:
// 声明一个变量并初始化
var age = 25;
// 使用typeof检测变量的数据类型
console.log(typeof age); // 输出: "number"
// 改变变量的数据类型
age = "twenty-five";
console.log(typeof age); // 输出: "string"
// 声明一个字符串变量
var name = "John";
// 声明一个布尔变量
var isStudent = true;
// 声明一个数组变量
var numbers = [1, 2, 3, 4, 5];
// 声明一个对象变量
var person = {
name: "John",
age: 30,
};
// 声明一个函数变量
var add = function (a, b) {
return a + b;
};
这些是 JavaScript 中的一些基本的变量和数据类型。可以根据具体的需求选择适当的数据类型来存储和操作数据。
1.1.2 运算符和表达式
JavaScript 提供了丰富的运算符和表达式,用于执行各种计算和操作。下面是一些常见的 JavaScript 运算符和表达式的示例:
+
,用于两个值的相加。-
,用于两个值的相减。*
,用于两个值的相乘。/
,用于两个值的相除。%
,返回两个值相除的余数。++
,将变量的值增加 1。--
,将变量的值减少 1。=
,将一个值赋给一个变量。+=
、-=
、*=
、/=
等,将运算符右侧的值与变量的值进行运算,并将结果赋给变量。==
,检查两个值是否相等。!=
,检查两个值是否不相等。===
,检查两个值是否类型和值都相等。!==
,检查两个值是否类型或值不相等。>
,检查左侧的值是否大于右侧的值。<
,检查左侧的值是否小于右侧的值。>=
,检查左侧的值是否大于或等于右侧的值。<=
,检查左侧的值是否小于或等于右侧的值。&&
,如果两个条件都为真,则返回真。||
,如果两个条件中有一个为真,则返回真。!
,将一个条件取反。condition ? expr1 : expr2
,根据条件的真假返回不同的值。+
,将两个字符串连接起来。typeof
:返回一个值的数据类型。instanceof
:检查对象是否属于某个特定的类。这些只是一些常见的 JavaScript 运算符和表达式示例。JavaScript 还提供了其他运算符和表达式,用于更复杂
1.1.3 控制流程和条件语句
JavaScript 提供了各种控制流程和条件语句,用于根据不同的条件执行不同的代码块。以下是一些常见的控制流程和条件语句:
if
语句:用于根据条件执行代码块。if (condition) {
// 如果条件为真,则执行这里的代码
} else {
// 如果条件为假,则执行这里的代码
}
if...else if...else
语句:用于多个条件的判断。if (condition1) {
// 如果条件1为真,则执行这里的代码
} else if (condition2) {
// 如果条件2为真,则执行这里的代码
} else {
// 如果所有条件都为假,则执行这里的代码
}
switch
语句:用于基于不同的情况执行代码块。switch (expression) {
case value1:
// 当表达式等于value1时执行这里的代码
break;
case value2:
// 当表达式等于value2时执行这里的代码
break;
default:
// 如果表达式的值与任何case都不匹配,则执行这里的代码
break;
}
for
循环:用于重复执行代码块一定次数。for (initialization; condition; increment) {
// 在每次循环迭代中执行这里的代码
}
while
循环:用于在满足条件时重复执行代码块。while (condition) {
// 只要条件为真,就一直执行这里的代码
}
do...while
循环:先执行代码块,然后再检查条件,如果满足条件,则继续执行。do {
// 执行这里的代码
} while (condition);
break
语句:用于跳出循环,终止循环的执行。for (var i = 0; i < 10; i++) {
if (i === 5) {
break; // 当i等于5时跳出循环
}
// 执行这里的代码
}
continue
语句:用于跳过当前循环的剩余代码,并继续下一次循环。for (var i = 0; i < 10; i++) {
if (i === 5) {
continue; // 当i等于5时跳过当前循环的剩余代码
}
// 执行这里的代码
}
以上是一些常见的 JavaScript 控制流程和条件语句示例。它们使
1.1.4 函数和作用域
在 JavaScript 中,函数是可重复使用的代码块,它接受输入参数并返回一个值。函数允许您将代码逻辑组织为独立的单元,使其更易于理解、维护和重用。
以下是定义函数的一般语法:
function functionName(parameter1, parameter2, ...) {
// 函数体,包含要执行的代码
return result; // 可选的返回值
}
functionName
是函数的名称,可以根据需求自定义。parameter1
, parameter2
, … 是函数的参数列表,用于接收传递给函数的值。return
语句可用于指定函数的返回值,它将函数调用的结果返回给调用方。函数的调用通过函数名加括号完成,可以传递实际的参数值:
var result = functionName(argument1, argument2, ...);
JavaScript 还具有函数表达式的方式来定义函数:
var functionName = function(parameter1, parameter2, ...) {
// 函数体,包含要执行的代码
return result; // 可选的返回值
};
函数表达式将函数赋值给一个变量,可以像其他变量一样使用该变量。
作用域(Scope)是指变量在代码中的可访问性范围。JavaScript 具有函数作用域和块级作用域。
let
或const
关键字声明的变量具有块级作用域,它们只在最近的包含块(通常是由大括号{}
定义的代码块)内可见。以下是一个简单的示例,演示了函数和作用域的概念:
function greet(name) {
var message = "Hello, " + name; // 在函数作用域内声明的变量
console.log(message);
}
greet("John"); // 输出: "Hello, John"
console.log(message); // 报错,message不在全局作用域内可见
if (true) {
let count = 5; // 在块级作用域内声明的变量
console.log(count); // 输出: 5
}
console.log(count); // 报错,count不在全局作用域内可见
这是函数和作用域在 JavaScript 中的基本概念。使用函数和适当的作用域,可以组织和管理代码,提高可重用性和可维护性。
1.2 ECMAScript 新特性回顾
1.2.1 ES6 的变化和新增功能
ECMAScript 6(ES6),也称为 ECMAScript 2015,是 JavaScript 的一个重要版本,引入了许多新的功能和语法改进。下面是 ES6 中的一些主要变化和新增功能:
let
和const
关键字,允许在块级作用域内声明变量,解决了使用var
声明的变量提升问题。this
值。undefined
时将使用默认值。...
语法可以将数组或对象展开,可以用于函数调用、数组字面量、对象字面量等场景。export
和import
关键字在不同模块之间共享代码。Map
、Set
、WeakMap
、WeakSet
等新的数据结构,提供了更灵活和高效的数据存储方式。这些只是 ES6 中的一些主要变化和新增功能。ES6 引入的这些功能提高了 JavaScript 的可读性、可维护性和开发效率,并且被广泛支持和采用。
1.2.2 ES7、ES8 和 ES9 的特性
以下是 ES7(ECMAScript 2016)、ES8(ECMAScript 2017)和 ES9(ECMAScript 2018)的一些主要特性:
ES7(ECMAScript 2016):
ES8(ECMAScript 2017):
String.prototype.padStart()
和String.prototype.padEnd()
方法,可以在字符串的开头或结尾添加指定数量的字符。Object.values()
和Object.entries()
方法,可以分别获取对象的值和键值对的迭代器。async
和await
关键字,简化了使用 Promise 处理异步操作的语法,使得异步代码更加清晰和易读。ES9(ECMAScript 2018):
Symbol.asyncIterator
和for-await-of
语法,可以处理异步迭代的情况。Promise.prototype.finally()
方法,可以指定在 Promise 完成或拒绝后,无论如何都要执行的回调函数。...
语法将对象的剩余属性组合成一个新的对象。这些是 ES7、ES8 和 ES9 中的一些主要特性。每个版本都引入了新的语言功能和改进,旨在提高 JavaScript 的开发体验和功能性。请注意,这些特性在不同的 JavaScript 环境中可能有不同的支持程度,因此在使用这些特性时需要注意目标平台的兼容性。