当前位置:   article > 正文

JS的高级用法

JS的高级用法

关于JS高级用法

在学习JavaScript的过程中,我们必须了解一些基础知识,如变量、函数、类、循环等。这些基础知识是我们使用JavaScript的基础。但是,在日常的业务开发中,我们需要一些更高级的技巧来更好地解决问题。

通过阅读本文,你将了解到JS的高级知识点以及实际应用技巧,如高级数据结构和算法、函数式编程、异步编程和面向对象编程。我们会利用代码实例来让大家更好地理解这些知识点。同时,我们也会提供一些实战案例的示范和使用技巧,让你更好地将这些技术应用到实际业务中。

高级数据结构和算法

Map和Set数据结构

在JavaScript中,Map数据结构通常用于存储键值对,它可以使用任意类型作为键和值。Set数据结构用于存储唯一值的集合。

  1. // 创建Map对象
  2. const map = new Map();
  3. // 设置键值对
  4. map.set('name', 'Tom');
  5. map.set('age', 20);
  6. // 获取键值对
  7. console.log(map.get('name')); // 'Tom'
  8. console.log(map.get('age')); // 20
  9. // 创建Set对象
  10. const set = new Set();
  11. // 添加元素
  12. set.add(10);
  13. set.add(20);
  14. set.add(30);
  15. // 删除元素
  16. set.delete(20);
  17. // 判断元素是否存在
  18. console.log(set.has(10)); // true
  19. console.log(set.has(20)); // false

堆、栈和队列

堆和栈是常用的内存分配方式。栈是一种后进先出的数据结构,堆是一种动态分配的内存结构。队列是一种先进先出的数据结构,它通常用于缓存和并发编程中。

  1. // 使用数组模拟堆
  2. const arr = [1, 2, 3, 4];
  3. arr.push(5); // 入堆
  4. console.log(arr.pop()); // 出堆
  5. // 使用数组模拟栈
  6. const stack = [1, 2, 3, 4];
  7. stack.push(5); // 入栈
  8. console.log(stack.pop()); // 出栈
  9. // 使用数组模拟队列
  10. const queue = [1, 2, 3, 4];
  11. queue.push(5); // 入队
  12. console.log(queue.shift()); // 出队

深度优先搜索和广度优先搜索

深度优先搜索(DFS)和广度优先搜索(BFS)是常用的遍历算法。DFS通常用于解决深度问题,BFS适用于宽度问题。

  1. // 深度优先遍历
  2. function dfs(node) {
  3. if (node == null) return;
  4. console.log(node.value);
  5. dfs(node.left);
  6. dfs(node.right);
  7. }
  8. // 广度优先遍历
  9. function bfs(node) {
  10. const queue = [node];
  11. while (queue.length) {
  12. const curr = queue.shift();
  13. console.log(curr.value);
  14. if (curr.left) queue.push(curr.left);
  15. if (curr.right) queue.push(curr.right);
  16. }
  17. }

常用算法

常用的算法有排序、搜索、查找等。

// 排序算法:快速排序使用分治思想,通过把数组分成较小的块来排序

  1. function quickSort(arr) {
  2. if (arr.length < 2) {
  3. return arr;
  4. }
  5. let pivot = arr[0];
  6. let left = [];
  7. let right = [];
  8. for (let i = 1; i < arr.length; i++) {
  9. if (arr[i] < pivot) {
  10. left.push(arr[i]);
  11. } else {
  12. right.push(arr[i]);
  13. }
  14. }
  15. return [...quickSort(left), pivot, ...quickSort(right)];
  16. }
  17. // 查找算法:
  18. function binarySearch(arr, target) {
  19. let left = 0;
  20. let right = arr.length - 1;
  21. while (left <= right) {
  22. const mid = Math.floor((left + right) / 2);
  23. if (arr[mid] === target) {
  24. return mid;
  25. } else if (arr[mid] < target) {
  26. left = mid + 1;
  27. } else {
  28. right = mid - 1;
  29. }
  30. }
  31. return -1;
  32. }

函数式编程

高阶函数和柯里化

高阶函数和柯里化是函数式编程中的常见概念,它们可以让我们创建更加抽象、灵活的函数。

  1. // 高阶函数
  2. function higherOrderFunction(func) {
  3. return function (num) {
  4. return func(num);
  5. };
  6. }
  7. function double(num) {
  8. return num * 2;
  9. }
  10. const doubleFunc = higherOrderFunction(double);
  11. console.log(doubleFunc(10)); // 20
  12. // 柯里化
  13. function curry(func) {
  14. return function curried(...args) {
  15. if (args.length >= func.length) {
  16. return func.apply(this, args);
  17. } else {
  18. return function (...args2) {
  19. return curried.apply(this, [...args, ...args2]);
  20. };
  21. }
  22. };
  23. }
  24. function sum(a, b, c) {
  25. return a + b + c;
  26. }
  27. const curriedSum = curry(sum);
  28. console.log(curriedSum(1)(2)(3)); // 6

闭包和作用域

闭包和作用域是JavaScript中比较常见的概念。闭包可以让我们维护函数内的状态,作用域则决定了变量的可见范围。

  1. // 闭包
  2. function closure() {
  3. let i = 0;
  4. return function () {
  5. return ++i;
  6. };
  7. }
  8. const func = closure();
  9. console.log(func()); // 1
  10. console.log(func()); // 2
  11. // 作用域
  12. let a = 10;
  13. function foo() {
  14. let a = 20;
  15. console.log(a); // 20
  16. }
  17. foo();
  18. console.log(a); // 10

函数式编程中的常见模式

函数式编程中有很多常见的模式,如map、filter、reduce等。

  1. // map
  2. const arr = [1, 2, 3];
  3. const mapArr = arr.map((item) => item * 2);
  4. console.log(mapArr); // [2, 4, 6]
  5. // filter
  6. const filterArr = arr.filter((item) => item > 1);
  7. console.log(filterArr); // [2, 3]
  8. // reduce
  9. const reduceArr = arr.reduce((sum, curr) => sum + curr, 0);
  10. console.log(reduceArr); // 6

异步编程

Promise和async/await

Promise和async/await是常见的异步编程方式,它们可以让我们更好地处理异步编程中的问题。

  1. // Promise
  2. function promise() {
  3. return new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. resolve('done');
  6. }, 1000);
  7. });
  8. }
  9. promise().then((result) => console.log(result)); // 'done'
  10. // async/await
  11. async function asyncFunc() {
  12. const result = await promise();
  13. console.log(result);
  14. }
  15. asyncFunc(); // 'done'

事件循环和EventEmitter

事件循环和EventEmitter用于处理异步事件,它们可以让我们更好地处理事件流。

  1. // 事件循环
  2. console.log('start');
  3. setTimeout(() => {
  4. console.log('setTimeout');
  5. }, 0);
  6. Promise.resolve().then(() => console.log('promise'));
  7. console.log('end');
  8. // EventEmitter
  9. const { EventEmitter } = require('events');
  10. const emitter = new EventEmitter();
  11. emitter.on('doSomething', (arg1, arg2) => {
  12. console.log(`${arg1} ${arg2}`);
  13. });
  14. emitter.emit('doSomething', 'Hello', 'World'); // 'Hello World'

Web Worker

Web Worker可以让我们将长时间运行的任务移出主线程,以避免阻塞UI。

  1. // 主线程
  2. const worker = new Worker('worker.js');
  3. worker.onmessage = (event) => {
  4. console.log(event.data);
  5. };
  6. worker.postMessage('start');
  7. // worker.js
  8. self.onmessage = (event) => {
  9. const result = longCalculation(event.data);
  10. self.postMessage(result);
  11. };

面向对象编程

类和继承

JavaScript中的类和继承与其他面向对象编程语言类似。

  1. // 类
  2. class Animal {
  3. constructor(name) {
  4. this.name = name;
  5. }
  6. speak() {
  7. console.log(`${this.name} makes a noise.`);
  8. }
  9. }
  10. class Cat extends Animal {
  11. constructor(name, breed) {
  12. super(name);
  13. this.breed = breed;
  14. }
  15. speak() {
  16. console.log(`${this.name} meows.`);
  17. }
  18. get description() {
  19. return `${this.name} is a ${this.breed} cat.`;
  20. }
  21. set nickname(nick) {
  22. this.name = nick;
  23. }
  24. }
  25. const cat = new Cat('Fluffy', 'Persian');
  26. cat.speak(); // 'Fluffy meows.'
  27. console.log(cat.description); // 'Fluffy is a Persian cat.'
  28. cat.nickname = 'Fuffy';
  29. console.log(cat.name); // 'Fuffy'

Encapsulation、Inheritance、Polymorphism(封装、继承、多态)

封装、继承、多态是面向对象编程中的重要概念。

  1. // 封装
  2. class Person {
  3. constructor(name) {
  4. this._name = name;
  5. }
  6. get name() {
  7. return this._name.toUpperCase();
  8. }
  9. set name(newName) {
  10. this._name = newName;
  11. }
  12. }
  13. const person = new Person('John');
  14. console.log(person.name); // 'JOHN'
  15. person.name = 'Lisa';
  16. console.log(person.name); // 'LISA'
  17. // 继承
  18. class Shape {
  19. constructor(color) {
  20. this.color = color;
  21. }
  22. draw() {
  23. console.log('Drawing a shape...');
  24. }
  25. }
  26. class Circle extends Shape {
  27. constructor(color, radius) {
  28. super(color);
  29. this.radius = radius;
  30. }
  31. draw() {
  32. console.log(`Drawing a ${this.color} circle with radius ${this.radius}.`);
  33. }
  34. }
  35. const circle = new Circle('red', 10);
  36. circle.draw(); // 'Drawing a red circle with radius 10.'
  37. // 多态
  38. function drawShape(shape) {
  39. shape.draw();
  40. }
  41. drawShape(new Shape('blue')); // 'Drawing a shape...'
  42. drawShape(new Circle('green', 20)); // 'Drawing a green circle with radius 20.'

总结和实战

在本文中,我们介绍了一些JavaScript的高级知识点,如高级数据结构和算法、函数式编程、异步编程和面向对象编程。我们还提供了一些代码示例和实战案例,让掘友们更好地理解和掌握这些技术。

通过Promise.all实现并发请求

  1. function fetchData(urls) {
  2. const promises = urls.map((url) => fetch(url));
  3. return Promise.all(promises).then((responses) =>
  4. Promise.all(
  5. responses.map((response) => {
  6. if (!response.ok) throw new Error(response.statusText);
  7. return response.json();
  8. })
  9. )
  10. );
  11. }

使用async/await实现异步调用

  1. async function getData(url) {
  2. const response = await fetch(url);
  3. if (!response.ok) throw new Error(response.statusText);
  4. const data = await response.json();
  5. return data;
  6. }

在面向对象编程中使用工厂模式

  1. class Product {
  2. constructor(name, price) {
  3. this.name = name;
  4. this.price = price;
  5. }
  6. }
  7. class ProductFactory {
  8. createProduct(name, price) {
  9. return new Product(name, price);
  10. }
  11. }
  12. const productFactory = new ProductFactory();
  13. const product = productFactory.createProduct('Apple', 1);
  14. console.log(product.name); // 'Apple'
  15. console.log(product.price); // 1

以上是一些简单的实战示例,但实际开发中,我们需要更加复杂和具体的案例来应对实际问题。希望本文能够为读者提供一些参考,让大家更好地掌握JavaScript的高级用法,像大神一样使用JavaScript进行开发。

在掌握一些高级技巧之后,还应该注重代码质量与可维护性等方面。我们可以采用一些工具和规范来帮助我们改善代码质量,例如ESLint、Prettier、代码规范等。只有在代码质量和可维护性上下功夫,我们才能成为真正的JavaScript大神。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/109460
推荐阅读
相关标签
  

闽ICP备14008679号