JS 【手写】2024最新版

简介: JS 【手写】2024最新版

手写 promise.all

function pAll (_promises) {
    return new Promise((resolve, reject) => {
      // Iterable => Array
      const promises = Array.from(_promises)
      // 结果用一个数组维护
      const r = []
      const len = promises.length
      let count = 0
      for (let i = 0; i < len; i++) {
        // Promise.resolve 确保把所有数据都转化为 Promise
        Promise.resolve(promises[i]).then(o => { 
          // 因为 promise 是异步的,保持数组一一对应
          r[i] = o;
  
          // 如果数组中所有 promise 都完成,则返回结果数组
          if (++count === len) {
            resolve(r)
          }
          // 当发生异常时,直接 reject
        }).catch(e => reject(e))
      }
    })
 }

手写 getType

获取任意数据的数据类型

/**
 * 获取任意数据的数据类型
 *
 * @param x 变量
 * @returns 返回变量的类型名称(小写字母)
 */
function getType(x) {
  // 获取目标数据的私有属性 [[Class]] 的值
  const originType = Object.prototype.toString.call(x); // 以字符串为例:'[object String]'
  // 获取类型属性值中' '的下标
  const spaceIndex = originType.indexOf(" ");
  // 截取类型属性值中' '到末尾']'之间的字符串
  const type = originType.slice(spaceIndex + 1, -1); // 以字符串为例:'String'
  // 将字符串转换为小写
  return type.toLowerCase(); //以字符串为例:'string'
}

手写深拷贝 deepClone

/**
 * 深拷贝
 * @param {Object} obj 要拷贝的对象
 */
function deepClone(obj = {}) {
    if (typeof obj !== 'object' || obj == null) {
        // obj 是 null ,或者不是对象和数组,直接返回
        return obj
    }
 
    // 初始化返回结果
    let result
    if (obj instanceof Array) {
        result = []
    } else {
        result = {}
    }
 
    for (let key in obj) {
        // 保证 key 不是原型的属性
        if (obj.hasOwnProperty(key)) {
            // 递归调用!!!
            result[key] = deepClone(obj[key])
        }
    }
 
    // 返回结果
    return result
}

手写数组反转 arrReverse

function arrReverse(arr) {
  let newArr = [];
  arr.forEach(function (item) {
    newArr.unshift(item);
  });
 
  return newArr;
}

手写类 class

https://blog.csdn.net/weixin_41192489/article/details/139442546

手写解析 url 中的参数

function getUrlParam(name) {
  let params_str = location.search.substring(1);
  let params_dic = {};
  params_str.split("&").forEach((item) => {
    let paramItem_list = item.split("=");
    if (paramItem_list.length === 2) {
      params_dic[paramItem_list[0]] = paramItem_list[1];
    }
  });
 
  return decodeURIComponent(params_dic[name]);
}

手写简易 jQuery

考虑插件和扩展性

class jQuery {
    constructor(selector) {
        const result = document.querySelectorAll(selector)
        const length = result.length
        for (let i = 0; i < length; i++) {
            this[i] = result[i]
        }
        this.length = length
        this.selector = selector
    }
    get(index) {
        return this[index]
    }
    each(fn) {
        for (let i = 0; i < this.length; i++) {
            const elem = this[i]
            fn(elem)
        }
    }
    on(type, fn) {
        return this.each(elem => {
            elem.addEventListener(type, fn, false)
        })
    }
    // 扩展很多 DOM API
}
 
// 插件
jQuery.prototype.dialog = function (info) {
    alert(info)
}
 
// 扩展
class myJQuery extends jQuery {
    constructor(selector) {
        super(selector)
    }
    // 扩展自己的方法
    addClass(className) {
 
    }
    style(data) {
        
    }
}
相关文章
|
前端开发 NoSQL 数据库
egg.js项目部署上线服务器
egg.js项目部署上线服务器
887 0
egg.js项目部署上线服务器
|
1月前
|
弹性计算 监控 网络协议
阿里云服务器ECS网络带宽解读:公网带宽、内网带宽、突发带宽区别及使用注意事项
阿里云服务器ECS(Elastic Compute Service)的网络带宽配置是影响服务器性能的关键因素,涉及公网带宽、内网带宽及突发带宽三大核心维度。本文为大家系统解析这三类带宽的特性、配置方法及使用注意事项,助力用户精准优化网络架构。
247 1
|
1月前
|
弹性计算 安全 数据安全/隐私保护
阿里云渠道商:ECS 服务器带宽如何升级或降级?
阿里云ECS凭借弹性伸缩、高性价比、全球部署与多重安全防护,成为企业上云首选。支持带宽在线升降配,灵活应对业务变化。本文详解带宽调整步骤及注意事项,助力高效用云。
|
8月前
|
JavaScript 算法 前端开发
解决若依框架中 npm run dev 卡在 95% 的问题
本文深入探讨若依框架中 `npm run dev` 卡在 95% 的问题,分析其与 Node.js 17+ 内置 OpenSSL 3.0 加密策略变更的关系。提供临时(设置环境变量 `NODE_OPTIONS=--openssl-legacy-provider`)和永久(修改 `package.json` 脚本)解决方案,同时建议降级 Node.js 或更新依赖以根本解决兼容性问题。最后强调依赖管理与开发环境标准化的重要性,助力团队高效开发。
786 1
|
JavaScript 前端开发 开发工具
Flutter&鸿蒙next 中如何实现 WebView【跳、显、适、反】等一些基础问题
在 Flutter 项目中集成 WebView 可以展示网页或进行在线操作。本文介绍了如何添加依赖、配置平台权限、创建 WebView 页面、适配不同机型、处理页面间参数传递等详细步骤,帮助开发者高效实现 WebView 功能,提升用户体验。
682 4
|
存储 弹性计算 测试技术
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
阿里云服务器ECS实例可以分为多种实例规格族。根据CPU、内存等配置,一种实例规格族又分为多种实例规格。而实例规格又包含vCPU、处理器、内存、vTPM、本地存储、网络带宽、网络收发包PPS、连接数、弹性网卡、云盘带宽、云盘IOPS等指标,本文为大家详细介绍实例规格的这些指标,以供大家了解和选择。
1333 14
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
|
存储 缓存 前端开发
Web应用中的存储方式有哪些?
本文首发于微信公众号“前端徐徐”,介绍了几种常见的前端数据存储技术:Cookie、Web Storage(包括 localStorage 和 sessionStorage)、IndexedDB、Cache Storage 和 Memory Storage。每种技术的特点和使用场景不同,适用于不同的开发需求。文章详细解释了它们的使用方法、特点和应用场景,并提供了代码示例。
1648 2
Web应用中的存储方式有哪些?
|
缓存 移动开发 JavaScript
《vue2进阶篇:路由》第10章:vue-router,包括基础路由、嵌套路由、路由的query参数和params参数、命名路由、router-link的replace属性、编程式路由、缓存路由组件
《vue2进阶篇:路由》第10章:vue-router,包括基础路由、嵌套路由、路由的query参数和params参数、命名路由、router-link的replace属性、编程式路由、缓存路由组件
647 2
|
JavaScript 前端开发 数据安全/隐私保护
如何使用request-promise在发送请求时使用代理?
以上方法演示了如何在发送请求时使用 `request-promise`结合代理服务,适用于需要通过代理访问网络资源的场景。
243 0
|
Java
vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
835 1