# JavaScript 基础
JavaScript 是 Node.js 的核心,因此,在深入学习 Node.js 之前,我们需要对 JavaScript 有扎实的理解。本文将带你了解 JavaScript 的基础知识,并为进一步学习 Node.js 打下坚实的基础。
# 引言
# JavaScript 简介
JavaScript 是一种轻量级的编程语言,被广泛用于 Web 开发中,以实现网页的动态效果和用户交互。它是一种解释型语言,通常在用户的浏览器中运行,但也可以在服务器端运行,如 Node.js 环境。
# JavaScript 在 Web 开发中的地位
JavaScript 是 Web 开发中的三大核心技术之一,与 HTML 和 CSS 共同构成了现代网页的基础。HTML 定义了网页的结构,CSS 负责样式和布局,而 JavaScript 则负责网页的行为和交互。
# 基本语法
# 变量与数据类型
JavaScript 中的变量使用 var
、 let
或 const
关键字声明。其中, var
是 ES5 及之前版本的关键字,而 let
和 const
是 ES6(ECMAScript 2015)引入的,用于声明块级作用域的变量。
JavaScript 的数据类型包括:
- 基本数据类型:
Undefined
、Null
、Boolean
、Number
、String
、Symbol
(ES6 新增) - 引用数据类型:
Object
(包括Array
、Function
、Date
等)
# 操作符
JavaScript 的操作符包括算术操作符、比较操作符、逻辑操作符、赋值操作符等。它们用于执行数学计算、比较值、逻辑判断等操作。
# 控制结构
控制结构用于控制代码的执行流程,包括:
- 条件语句:
if
、else if
、else
- 循环语句:
for
、while
、do...while
、for...in
、for...of
(ES6 新增)
# 函数与作用域
# 函数定义与调用
JavaScript 中的函数是一段可重复执行的代码块。可以通过函数声明、函数表达式或箭头函数(ES6 新增)来定义函数。
// 函数声明 | |
function greet(name) { | |
return `Hello, ${name}!`; | |
} | |
// 函数表达式 | |
const greet = function(name) { | |
return `Hello, ${name}!`; | |
}; | |
// 箭头函数 | |
const greet = (name) => `Hello, ${name}!`; |
# 作用域链
JavaScript 的作用域指的是变量和函数的作用范围。它包括全局作用域和局部作用域(函数作用域)。在 ES6 中,还引入了块级作用域( let
和 const
)。
作用域链决定了如何查找变量,它保证了变量在执行环境中的有序访问。
# 闭包
闭包是指那些能够访问自由变量的函数。简单来说,闭包就是函数内部定义的函数,它可以访问其外部函数作用域中的变量。
function outer() { | |
let outerVar = 'I am from outer function'; | |
function inner() { | |
let innerVar = 'I am from inner function'; | |
console.log(outerVar); // 输出:I am from outer function | |
} | |
return inner; | |
} | |
const myClosure = outer(); | |
myClosure(); |
# 对象与原型链
# 创建对象
在 JavaScript 中,对象是一组无序的键值对集合。可以通过对象字面量、构造函数或 Object.create()
方法来创建对象。
// 对象字面量 | |
const person = { | |
name: 'John', | |
age: 30 | |
}; | |
// 构造函数 | |
function Person(name, age) { | |
this.name = name; | |
this.age = age; | |
} | |
const person = new Person('John', 30); | |
// Object.create() | |
const personProto = { | |
sayName: function() { | |
console.log(this.name); | |
} | |
}; | |
const person = Object.create(personProto); | |
person.name = 'John'; |
# 原型与原型链
每个 JavaScript 对象都有一个原型( prototype
),原型是一个对象,它可以让对象继承属性和方法。原型链是用于实现继承和共享属性的一个机制。
function Person(name) { | |
this.name = name; | |
} | |
Person.prototype.sayName = function() { | |
console.log(this.name); | |
}; | |
const person = new Person('John'); | |
person.sayName(); // 输出:John |
# 继承
JavaScript 的继承可以通过原型链、构造函数、组合继承、原型式继承、寄生式继承、寄生组合式继承等多种方式实现。
# 异步编程
# 事件循环
JavaScript 有一个基于事件循环的异步模型。事件循环负责监听调用栈和任务队列,当调用栈为空时,事件循环会从任务
队列中取出第一个任务并将其推入调用栈中执行。这种模型允许 JavaScript 执行非阻塞操作,如处理 I/O 操作和网络请求。
# 回调函数
回调函数是最常见的异步编程模式之一。它是一个作为参数传递给另一个函数的函数,这个函数会在某个操作完成后被调用。
function fetchData(callback) { | |
// 模拟异步操作,比如从服务器获取数据 | |
setTimeout(() => { | |
const data = 'Some data'; | |
callback(data); | |
}, 1000); | |
} | |
fetchData(function(data) { | |
console.log(data); // 一秒后输出:Some data | |
}); |
# Promise
Promise 是 ES6 中引入的用于处理异步操作的对象。它代表了一个可能还没有完成,但是将来会完成的操作。Promise 有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。
const promise = new Promise((resolve, reject) => { | |
// 执行异步操作 | |
setTimeout(() => { | |
const success = true; | |
if (success) { | |
resolve('Success!'); | |
} else { | |
reject('Error!'); | |
} | |
}, 1000); | |
}); | |
promise.then(message => { | |
console.log(message); // 一秒后输出:Success! | |
}).catch(error => { | |
console.error(error); | |
}); |
# async / await
async /await 是 ES2017 中引入的语法,它提供了一种更简洁的方式来处理 Promise。 async
关键字用于声明一个异步函数,而 await
关键字用于等待一个 Promise 完成。
async function fetchData() { | |
try { | |
const data = await new Promise((resolve, reject) => { | |
setTimeout(() => resolve('Some data'), 1000); | |
}); | |
console.log(data); // 一秒后输出:Some data | |
} catch (error) { | |
console.error(error); | |
} | |
} | |
fetchData(); |
# 高级概念
# 事件驱动编程
Node.js 是基于事件驱动的编程模型。在 Node 中,许多 API 都是基于事件和回调函数来实现的,例如文件系统操作和网络请求。
const fs = require('fs'); | |
fs.readFile('example.txt', 'utf8', (err, data) => { | |
if (err) { | |
console.error(err); | |
return; | |
} | |
console.log(data); | |
}); |
# 模块化
JavaScript 模块化是指将代码分割成可重用的块。在 Node.js 中,模块化是通过 require
和 module.exports
来实现的。
// 导出模块 | |
module.exports = { | |
greet: function(name) { | |
return `Hello, ${name}!`; | |
} | |
}; | |
// 导入模块 | |
const myModule = require('./myModule'); | |
console.log(myModule.greet('John')); // 输出:Hello, John! |
# ES6+ 新特性
ES6 及之后的版本引入了许多新特性,这些特性让 JavaScript 更加现代化和强大。以下是一些重要的 ES6 + 特性:
let
和const
声明变量- 箭头函数
- 模板字符串
- 默认参数
- 解构赋值
- Promise
- 类和继承
- 模块导入导出(
import
/export
) - async/await
- Proxy 和 Reflect
- Set 和 Map
# 总结
通过本文,我们了解了 JavaScript 的基础知识,包括语法、函数、对象、原型链、异步编程以及高级概念。这些知识是学习 Node.js 的基础,掌握它们将为你在 Node 学习之路上奠定坚实的基础。在接下来的文章中,我们将进一步探索 Node.js 的环境和 Express 框架,带你进入服务器端编程的世界。