必须掌握的Node.js起点JavaScript主题
Node.js 是一个开源的、跨平台的运行时环境,用于在浏览器之外执行JavaScript代码。您需要记住,Node.js不是一个框架,也不是一种编程语言。许多人会感到困惑,以为它是一个框架或者一种编程语言。我们经常使用Node.js来构建后端服务,如Web应用程序或移动应用程序的API。它由Paypal、Uber、Netflix、Walmart等大公司在生产中使用。
在开始之前,您需要在计算机上安装Node.js。请查看此处以在Windows中安装Node.js。
一旦安装了Node.js,您可以开始创建您的第一个Node.js应用程序。下面是使用HTTP模块构建Web服务器的简单示例:
示例: 这是Node.js的基本示例:
const http = require('http');
let hostname = '127.0.0.1';
let port = 3000;
let server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://{hostname}:{port}/`);
});
输出:
在学习 Node.js 之前需要了解的内容:
要使用 Node.js,有以下 JavaScript 概念的强大理解是有帮助的:
词法结构: JavaScript 中规定代码应该如何表达的规则被称为词法结构或语法。这包括诸如标记(如关键字、标识符和标点符号)的放置以及它们在构建语句和表达式时的使用方式。
JavaScript 词法结构的一些基本元素如下:
- 区分大小写: JavaScript 区分大小写,这意味着变量 foo 和 Foo 被认为是不同的。
- 空格: JavaScript 忽略大多数空格(如空格、制表符和换行符),所以你可以使用它来格式化代码,使其更易于阅读。
- 行终止符: JavaScript 使用换行符(
\n
)表示行结尾。 - 分号: JavaScript 使用分号(
;
)来分隔语句。如果语句单独占据一行,通常可以省略分号,但为了避免潜在问题,建议始终要一致使用分号。 - 注释: JavaScript 支持两种类型的注释:单行注释(
//
)和多行注释(/* */
)。 - 标识符: 标识符用于命名变量、函数和代码中的其他元素。它们可以包含字母、数字、下划线(
_
)和美元符号($
),并且必须以字母、下划线或美元符号开头。 - 关键字: JavaScript 有一组保留字,不能用作标识符。其中包括像 var、function 和 if 这样的词。
表达式: JavaScript 中的表达式是生成值的代码部分。表达式可以独立使用,也可以作为更长语句的组成部分。
JavaScript 中的表达式可以采用多种不同的形式,包括:
- 字面量: 这些固定值在代码中被写作字面量。例如布尔值、字符串和整数(例如,42)以及 null 和 undefined。
- 变量: 它们是指被指定存储值的存储区域。在程序运行时,变量的值可能会改变。
- 运算符: 这些特殊符号对一个或一组值进行操作。例如比较运算符(如
>、==
和!=
)以及算术运算符(如+、-、*
和/
)。 - 函数调用: 这些表达式是调用函数的表达式。通过使用指定输入参数来调用函数后,表达式的值由函数的返回值确定。
- 数组和对象字面量: 这些表达式生成新的对象或数组。
数据类型 : 在JavaScript应用程序中,您可以使用多种形式的数据。JavaScript中使用的主要数据类型如下:
- 数字: 该数据类型表示数字值。它包含浮点数和整数值。在JavaScript中,您无需担心区分整数和浮点数,因为只有一种数字类型。
- 字符串: 该数据类型表示字符的串,如单词或句子。字符串需要引号(‘或“)。
- 布尔值: 该数据类型表示一个值是真还是假。它经常用于条件表达式中检查特定条件。
- 空: 该数据类型表示没有值或空引用。它是一个有意赋值为空。
- 未定义: 该数据类型表示没有值或未初始化的变量。与空不同的是,它不是有意赋值为空。
- 对象: 该数据类型表示一组键值对的集合。它可用于存储复杂的数据结构,如数组和字典。
类 : JavaScript中的类用作构建对象的指南。它指定了由该类生成的对象的特征和操作。
在ECMAScript 2015引入后,JavaScript添加了类(也称为ES6)。在此之前,JavaScript缺乏本地类语法,因此程序员必须使用原型和函数来编写面向对象的编程。
JavaScript中的’this’运算符 : JavaScript中的’this’运算符指的是当前执行代码的对象。它是访问对象内部的一种方法。
函数被调用的方式而不是定义的方式决定了’this’的值。这意味着根据调用函数的上下文,’this’的值可能会改变。
箭头函数 : 在JavaScript中,箭头函数(也称为“胖箭头函数”)是一种简洁定义函数表达式的方式。它具有比常规函数表达式更短的语法,并且没有自己的’this’、’arguments’、’super’或’new.target’。
循环 : 在JavaScript中,循环用于重复执行一段代码。JavaScript提供了多种类型的循环。
- for : 使用这个循环可以重复执行代码块一定次数。
- for-in : 这个循环用于遍历对象的属性。
- for-of : 这个循环用于迭代可迭代对象的值(例如数组或字符串)。
- while : 这个循环会在满足特定条件之前一直执行代码块。
- do-while : 这个循环类似于while循环,它始终至少执行一次代码块,并在此之后检查条件。
作用域 : JavaScript中的作用域是程序中变量可用的部分。在JavaScript中,有两种不同的作用域类型:全局作用域和局部作用域。
- 全局作用域 : 如果变量在任何函数外部定义,则称为全局作用域。程序中的任何位置都可以访问它们。
- 局部作用域 : 在函数内部定义的变量被称为局部作用域。只有声明它们的函数可以访问它们。
模板字面量 : 在JavaScript中,模板字面量是允许在字符串中嵌入表达式的字符串字面量。它们使用反引号(`)而不是单引号或双引号表示。
严格模式 : JavaScript中的严格模式允许用户选择使用更受限制的语言版本。在严格模式下,某些在非严格模式下允许的代码形式会产生错误。通过移除一些不太可靠的JavaScript组件,严格模式旨在帮助您编写更安全和可靠的代码。
您可以在脚本、函数或代码块的开头添加短语 “use strict” 来激活严格模式。
以下是严格模式进行的一些调整:
- 防止使用未声明的变量。
- 防止意外创建全局变量。
- 防止删除被视为不可配置的变量、函数或参数。
- 防止null或undefined值被更改为其他值。
- 防止在同一函数中使用与变量或函数同名的参数。
- 防止使用某些JavaScript关键字命名变量或函数。
ECMAScript 2015 (ES6)及其后续版本 :
ECMAScript 2015(ES6): JavaScript语言通过ECMAScript 2015(通常被称为ES6)的引入进行了重大更新,增加了几个新的功能,大大增强了语言的功能。ES6引入了许多重要的创新,其中一些包括:
- 箭头函数可以简洁地定义函数表达式。
- 类:提供了一个语法来设计面向对象编程并生成对象。
- 使用模板字面量,可以将表达式插入到字符串中。
- 使用let和const这两个新的变量声明方法可以声明具有块级作用域的变量。
- 使用模块可以组织和重用代码。
- 在引入ES6之后,JavaScript语言进行了其他修改,包括:
指数运算符(**
)和Array.prototype.includes()函数是在ECMAScript 2016(ES7)中添加的。
ECMAScript 2017 (ES8): 引入了Object.values()和Object.entries()方法,以及用于处理异步代码的async和await关键字。
ECMAScript 2018 (ES9): 引入了异步迭代和剩余/扩展属性语法。
ECMAScript 2019 (ES10): 引入了Array.prototype.flat()和Array.prototype.flatMap()方法,以及用于字符串的trimStart()和trimEnd()方法。
模块: Node.js使用模块化设计,这意味着您可以将代码组织成较小、可重用的块,称为模块。了解如何创建、导入和导出模块对于构建可扩展和可维护的Node.js应用程序至关重要。
HTTP: Node.js包含一个内置的HTTP模块,可以用于创建服务器和进行HTTP请求。了解如何使用该模块对于构建Web服务器和与API进行交互至关重要。
流: Node.js包含一个内置的流模块,可以用于处理流式数据。了解如何从流中读取和写入数据对于处理大量数据或构建高效的数据流水线很有用。Node.js包含一个内置的流模块,可以用于处理流式数据。了解如何从流中读取和写入数据对于处理大量数据或构建高效的数据流水线很有用。
文件系统: Node.js包含一个内置的文件系统模块,可以用于读取和写入文件系统。了解如何使用该模块对于读取和写入文件系统以及其他与文件系统的交互方式都很有用。
调试: 由于Node.js语言的异步特性,调试Node.js应用程序可能会有挑战性。熟悉诸如Node.js调试器和console.log等工具对于故障排除和识别代码中的问题将很有帮助。
除了这些核心概念外,还有一个在一般的JavaScript编程中打下坚实基础也非常有帮助,包括变量、函数、对象和数组等概念。
异步编程: JavaScript中的异步编程允许在不妨碍主线程操作的情况下完成耗时的活动。这意味着当操作在后台完成时,应用程序可以继续运行,这对于那些需要很长时间才能完成的活动(例如发起网络请求或从文件中读取)非常有帮助。
Node.js基于事件驱动的架构构建,这意味着它被设计来处理异步操作。这意味着为了编写高效和有效的Node.js代码,您需要熟悉回调、promises和async/await等概念。
JavaScript中可以使用多种方法进行异步编程,包括:
回调函数: 这些是作为参数传递给另一个函数的函数,在任务完成时被调用。
promises: 这些是表示异步操作的最终完成(或失败)的对象。它们具有一个then()方法,当操作完成时调用该方法,还有一个可选的catch()方法,当操作失败时调用该方法。
async/await: 这些是用来编写看起来同步的异步代码的关键字。它们与async函数和Promises结合使用。
定时器: 在JavaScript中,定时器是允许您在稍后的时间执行代码的函数。
有两种类型的定时器:setTimeout和setInterval。
- setTimeout: 此函数在指定的毫秒数过去后执行一段代码。
- setInterval: 此函数以指定的间隔(以毫秒为单位)重复执行一段代码。
闭包: JavaScript中的闭包是指一个函数在返回后仍然可以访问其外部(封闭)函数的变量。
事件循环: 在JavaScript中,事件循环是一种处理响应事件的代码执行机制。它负责执行等待其他事件完成的代码,比如定时器或网络请求。
事件循环通过不断检查一个等待事件的队列并执行与这些事件相关联的代码来工作。当没有未决事件时,事件循环等待将新事件添加到队列中。
事件循环是JavaScript运行时的重要组成部分,也是语言支持异步和非阻塞的关键。