JS复习练习题目、完整nodejs项目以及Commons、Es

news/2025/2/24 21:40:04

### JS复习练习

- ![20250220204925](/up-z0.qiniup.com20250220204925.png)

1. 任务1:创建一个简单的问候函数

- 编写一个函数greet,接受一个名字作为参数,并返回一个问候语,例如:“Hello, [名字]! Welcome to JavaScript.”。

```js

function greet(name){

    return `Hello,${name}! Welcome to JavaScript`

}

console.log('===============创建简单的问候函数 =================');

console.log(greet('李华'));

```

2. 任务2:计算数组的平均值

- 编写一个函数calculateAverage,接受一个数字数组作为参数,并返回数组的平均值。

```js

function calculateAverage(arr) {

    let sum = 0

    arr.forEach(x => {

        sum += x

    });

    let ave = sum / arr.length

    return ave;

}

console.log('===============计算数组的平均值 =================');

console.log(calculateAverage([1,2,3,4,5]))

// 第二种方法【reduce】

function calculateAverage02(array) {

    const sum = array.reduce((x,y) => (x + y),0) /array.length

    return sum

}

console.log(calculateAverage02([1,2,3,4,5]));

```

3. 任务3:检查字符串是否为回文

- 编写一个函数isPalindrome,接受一个字符串作为参数,判断该字符串是否为回文(正读和反读相同)。

```js

function isPalindrome(Str){

    // 清理字符串,都变成小写,不要空字符 【 .toLowerCase(); 】

    const One = Str.replace(/[^a-zA-Z0-9]/g,'').toLowerCase()  // g 代表全局匹配,如果没有的话,默认为查找第一个字符

    // 反读 【split()把字符串拆分成数组】【reverse()反转】【join('')把数组重新拼接成字符串】

    const Two = One.split('').reverse().join('')

    if (One === Two) {

        console.log('是回文');

    }

    else{

        console.log('不是回文');

    }

}

console.log('===============检查字符串是否为回文 =================');

isPalindrome('alrla')

isPalindrome('abcd')

```

4. 任务4:实现一个简单的计数器

- 使用闭包实现一个简单的计数器,每次调用时返回当前的计数值。

```js

// 闭包:让内部函数能够访问并修改外部函数的作用域中的变量

// 定义一个外部函数

function A(){

    let number = 0

    // AA 函数的参数 number 不能与外部变量同名,会导致作用域冲突。

    // 去掉参数后,AA 函数可以直接访问和修改外部的 number,从而实现闭包的效果。

    function AA(){

        number ++

        // 返回当前值

        return number

    }

    // 返回内部函数的值,让外部可以调用

    return AA;

}

console.log('===============闭包=================');

const counts = A()

console.log(counts());

console.log(counts());

console.log(counts());

```

5. 任务5:过滤数组中的偶数

- 编写一个函数filterEvenNumbers,接受一个数字数组作为参数,返回一个只包含偶数的新数组。

```js

function filterEvenNumbers(ArrayList) {

    console.log("==============过滤数组中的偶数 =================");

    const NewAL = ArrayList.filter(item => item % 2 ==0 )

    console.log(NewAL);

}

filterEvenNumbers([1,2,3,4,5,6]);

```

6. 任务6:实现一个简单的对象工厂

- 编写一个函数createPerson,接受name和age作为参数,返回一个包含这些属性的对象。

```js

function createPerson(Name,Age) {

    const Obj = {Name,Age}

    return Obj

}

console.log("============== 简单的对象工厂 =================");

console.log(createPerson('翠花',18));

```

7. 任务7:递归计算阶乘

- 编写一个递归函数factorial,计算一个非负整数的阶乘。

```js

// 阶乘的定义是:

// n!=n×(n−1)×(n−2)×⋯×1

// 0!=1

function factorial(Num){

    if (Num == 0) {

        return 1

    }

    else{

        // factorial(Num-1) 是一个递归调用,而不是直接的数值。它的作用是计算 Num-1 的阶乘,然后将结果乘以当前的 Num。

        return Num * factorial(Num-1)

    }

}

function factorial02(Num){

    // 【三元运算符】 条件表达式 ? 表达式1 : 表达式2

    return Num == 0 ? 1 : Num * factorial02(Num - 1)

}

console.log("============== 递归计算阶乘  =================");

console.log(factorial(4));

console.log(factorial02(4));

```

8. 任务8:实现一个简单的事件监听器

- 编写一个函数addEventListener,模拟HTML元素的事件监听器功能。接受一个事件类型和一个回调函数作为参数,并在触发时调用回调函数。

```js

console.log("============== 事件监听器  =================");    

function addEventListene(event,callback){

    function even(){

        console.log(`这个${event}被触发了`);

        callback()

    }

    even()

}

addEventListene('click',function(){})

console.log("============== 实现简单的模块 =================");

```

9. 任务9:实现一个简单的模块

- 使用模块模式封装一个mathUtils模块,包含add和multiply两个函数

```js

const mathUtils = (function(){

    function add(a,b){

        return a+b

    }

    function multiply(a,b){

        return a*b

    }

    return{add,multiply}

})()

console.log(mathUtils.add(1,2));

console.log(mathUtils.multiply(1,2));

console.log("============== 实现Promise  =================");  

```

10. 任务9:实现一个简单的Promise

- 使用Promise实现一个异步函数fetchData,模拟从服务器获取数据。如果成功,返回一个字符串;如果失败,抛出一个错误。

```js

function fetchData(){

    return new Promise((resolve,reject)=>{

        const aa = true

        if (aa) {

            resolve('获取成功');

        }

        else{

            reject(new Error('获取失败'))

        }

    })

}

fetchData().then(x=>console.log(x))

```

### 创建完整nodejs项目

- package.json

```json

{

    "name":"Demo01",

    "main": "app.js",

    "scripts": {

        "rr":"node app.js"

    },

    "dependencies": {

        "koa":"latest"

    }

}

```

- npm i 安装依赖

- npm run rr 跑起来

- ![20250218131946](/up-z0.qiniup.com20250218131946.png)

### CommonJS 与 ES Modules 的区别及常规用法

1. CommonJS:是一种模块化规范,主要用于 Node.js 环境。它通过 require 和 module.exports 实现模块的导入和导出。

- 代码

```js

导出模块

// setting.js

function fn() {

    console.log('我是CommonJS');

}

function fn01() {

    console.log('我尝试一下');

}

module.exports = { fn, fn01 };

导入模块

// app.js

const abc = require('./setting');

abc.fn();      // 输出: 我是CommonJS

abc.fn01();    // 输出: 我尝试一下

```

2. ES Modules:是 JavaScript 的原生模块化规范,适用于浏览器和 Node.js(需配置支持)。它通过 import 和 export 实现模块的导入和导出。

    - 支持动态导入:通过 import() 返回一个 Promise,支持按需加载。

    - (需配置 "type": "module" 或使用 .mjs 文件扩展名)。

- 代码

```js

导出模块

// abc.mjs

export function fnA() {

    console.log('我是ES');

}

export const arr = [1, 2, 3, 4, 5, 6];

导入模块

// app.mjs

let abc = await import ('./abc.mjs')

abc.fnA()       // 输出: 我是ES

console.log(abc.arr)   // 输出: [1, 2, 3, 4, 5, 6]

```

#### CommonJS 与 ES Modules 的区别

| 特性             | CommonJS                                      | ES Modules                                      |

|------------------|-----------------------------------------------|-------------------------------------------------|

| **加载方式**      | 同步加载,运行时解析依赖                      | 静态分析,编译时解析依赖                         |

| **导入语法**      | 使用 `require()`                              | 使用 `import` 和 `export`                       |

| **动态加载支持**   | 不支持                                        | 支持(通过 `import()`)                         |

| **运行时性能**     | 稍低(动态解析)                              | 较高(静态优化)                                |

| **作用域**        | 模块私有作用域,模块导出的内容会被缓存        | 导入的是活的绑定,模块内部值变化会反映到导入处  |

| **适用环境**      | 主要用于 Node.js                              | 适用于浏览器和 Node.js                          |

| **文件扩展名**    | 默认 `.js`                                    | 需 `.mjs` 或配置 `"type": "module"`             |



 

## 注意事项

### 文件扩展名

- 如果使用 ES Modules,文件扩展名需为 `.mjs`,或在 `package.json` 中配置 `"type": "module"`。

- CommonJS 默认使用 `.js` 扩展名。

### 运行环境

- **CommonJS** 是 Node.js 的传统模块系统,适合服务器端开发。

- **ES Modules** 是现代 JavaScript 的模块化标准,适用于浏览器和 Node.js,支持静态分析和动态导入。


http://www.niftyadmin.cn/n/5864821.html

相关文章

代码审计初探

学会了基础的代码审计后,就该提高一下了,学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计,把相关文件放到phps…

开源一个可以调RGB三色的小灯棒子

开源一个可以调灯的小灯棒子。 主控用的STC8G1K08A-SOP8,RGB三色灯是WS2812B。 开源到立创开源广场了,可以直接进入下方链接,那边可以直接查看原理图和PCB。 一个可调RGB三色的小灯棒子 - 立创开源硬件平台一个可调RGB三色的小灯棒子https…

申请SSL证书,如何完成域名验证

一、前言 给大家分享一下Lets Encrypt 证书申请时,如何完成域名验证这一步操作的方法。 二、为什么要进行域名验证 申请SSL证书时进行域名验证的主要原因是确保证书只颁发给有权控制特定域名的实体。这是为了保证互联网的安全性和信任,防止恶意方获取不…

算法1-2 排序(快排)

题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。 输入输出…

Maven最新版安装教程

一、Maven下载 1.前往官网下载 点击前往官网 2.进去之后点击Download 如果是Windows用户使用Maven则选择apache-maven-x.x.x-bin.zip即可。Liunx和MacOS用户则选择apache-maven-x.x.x-bin.tar.zip。 由于服务器在国外下载可能会很慢或者失败,大家可以去网盘获取 …

1-19 .gitignore的作用

Keil编译时会生成很多中间文件,我们并不需要对这些文件进行版本控制,否则容易出现提交一次代码,结果出现两百多个文件变更 在本地仓库目录下打开git bash,输入以下命令: touch .gitignore 随后用vscode打开创建的.gi…

(面试经典问题之连接池篇)连接池构成、作用及其基本原理详解

一、什么是连接池 连接池一般指的是数据库连接池(connection pooling),是指程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请,使用,释放&#xf…

《离线唤醒+离线Vosk识别+DeepSeek+离线合成,你的第二大脑》

在快节奏的现代生活中,我们渴望一种能随时随地助力的智慧伙伴。现在,一款融合离线听写、唤醒功能、大模型上下文携带以及合成技术的智能工具横空出世,宛如成为你的第二大脑。 离线听写功能,让你摆脱网络束缚。无论是在静谧的图书…