我的编程空间,编程开发者的网络收藏夹
学习永远不晚

常用web前端手写功能实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

常用web前端手写功能实例分析

今天小编给大家分享一下常用web前端手写功能实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、Promise.all

Promise.myAll = function (promises) {  return new Promise((resolve, reject) => {    // promises 可以不是数组,但必须要具有 Iterator 接口    if (typeof promises[Symbol.iterator] !== 'function') {      reject('TypeError: promises is not iterable')    }    if (promises.length === 0) {      resolve([])    } else {      const res = []      const len = promises.length      let count = 0      for (let i = 0; i < len; i++) {        // Promise.resolve 的作用是将普通值或 thenable 对象转为 promise,promise 则直接返回        Promise.resolve(promises[i])          .then((data) => {            res[i] = data            count += 1            if (count === len) {              resolve(res)            }          })          .catch((err) => {            reject(err)          })      }    }  })}// testfunction p1() {  return new Promise((resolve, reject) => {    setTimeout(resolve, 1000, 1)  })}function p2() {  return new Promise((resolve, reject) => {    setTimeout(resolve, 1000, 2)  })}Promise.myAll([p1(), p2()]).then(res => {  console.log(res) // [1, 2]})

2、Promise.race

Promise.myRace = function (promises) {  return new Promise((resolve, reject) => {    // promises 可以不是数组,但必须要具有 Iterator 接口    if (typeof promises[Symbol.iterator] !== 'function') {      reject('TypeError: promises is not iterable')    }    for (const item of promises) {      // 先出来的结果会被 resolve 或 reject 出去, 一旦状态变化就不会再变      Promise.resolve(item).then(resolve, reject)    }  })}// testfunction p1() {  return new Promise((resolve, reject) => {    setTimeout(resolve, 1000, 1)  })}function p2() {  return new Promise((resolve, reject) => {    setTimeout(resolve, 1000, 2)  })}Promise.myRace([p1(), p2()]).then((res) => {  console.log(res) // 1})

3、Promise.any

Promise.myAny = function (promises) {  return new Promise((resolve, reject) => {    // promises 可以不是数组,但必须要具有 Iterator 接口    if (typeof promises[Symbol.iterator] !== 'function') {      reject('TypeError: promises is not iterable')    }    const len = promises.length    let count = 0    for (let i = 0; i < len; i++) {      Promise.resolve(promises[i]).then(resolve, (err) => {        count += 1        if (count === promises.length) {          reject(new Error('所有 promise 都失败'))        }      })    }  })}// testfunction p1() {  return new Promise((resolve, reject) => {    setTimeout(reject, 1000, 1)  })}function p2() {  return new Promise((resolve, reject) => {    setTimeout(resolve, 1000, 2)  })}Promise.myAny([p1(), p2()]).then((res) => {  console.log(res) // 2})

4、冒泡排序

function bubbleSort(arr) {  let len = arr.length  for (let i = 0; i < len - 1; i++) {    // 从第一个元素开始,比较相邻的两个元素,前者大就交换位置    for (let j = 0; j < len - 1 - i; j++) {      if (arr[j] > arr[j + 1]) {        // 交换位置        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]      }    }    // 每次遍历结束,都能找到一个最大值,放在数组最后  }  return arr}// testconst arr = [3, 1, 2, 5, 4]console.log(bubbleSort(arr)) // [1, 2, 3, 4, 5]

5、选择排序

function selectSort(arr) {  let len = arr.length  for (let i = 0; i < len - 1; i++) {    // 假设每次循环,最小值就是第一个    let minIndex = i    for (let j = i + 1; j < len; j++) {      // 如果最小值大于其他的值,则修改索引,从而找到真正的最小值      if (arr[minIndex] > arr[j]) {        minIndex = j      }    }    // 最小值和第一个交换位置    [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]  }  return arr}// testconst arr = [3, 1, 2, 5, 4]console.log(bubbleSort(arr)) // [1, 2, 3, 4, 5]

6、快速排序

function quickSort(arr) {  if (arr.length <= 1) return arr  // 每次取第一个元素作为基准值  const pivot = arr.shift()  const left = []  const right = []  for (let i = 0; i < arr.length; i++) {    if (arr[i] < pivot) {      // 如果小于基准值,则把它放在左数组      left.push(arr[i])    } else {      // 如果大于等于基准值,则放在右数组      right.push(arr[i])    }  }  // 递归处理,并把左中右三个数组拼接起来  return quickSort(left).concat([pivot], quickSort(right))}// testconst arr = [3, 1, 2, 5, 4]console.log(quickSort(arr)) // [1, 2, 3, 4, 5]

7、call

Function.prototype.myCall = function (context = globalThis) {  // 把方法添加到 context 上,这样使用context[key]调用的时候,内部的 this 就指向了 context  // 使用 Symbol 防止 context 原有属性被覆盖  const key = Symbol('key')  context[key] = this  const args = [...arguments].slice(1)  const res = context[key](...args)  delete context[key]  return res}// testconst myName = { name: 'Jack' }function say() {  const [age, height] = arguments  console.log(`My name is ${this.name}, My age is ${age}, My height is ${height}`)}say.myCall(myName, 16, 170) // My name is Jack, My age is 16, My height is 170

8、apply

Function.prototype.myApply = function (context = globalThis) {  // 把方法添加到 context 上,这样使用context[key]调用的时候,内部的 this 就指向了 context  // 使用 Symbol 防止 context 原有属性被覆盖  const key = Symbol('key')  context[key] = this  let res  if (arguments[1]) {    res = context[key](...arguments[1])  } else {    res = context[key]()  }  delete context[key]  return res}// testconst myName = { name: 'Jack' }function say() {  const [age, height] = arguments  console.log(`My name is ${this.name}, My age is ${age}, My height is ${height}`)}say.myApply(myName, [16, 170]) // My name is Jack, My age is 16, My height is 170

9、bind

Function.prototype.myBind = function (context = globalThis) {  const fn = this  const args = [...arguments].slice(1)  const newFunc = function () {    const newArgs = args.concat(...arguments)    if (this instanceof newFunc) {      // 通过 new 调用,this 为新创建的对象实例,将函数内部的 this 替换为这个新对象      fn.apply(this, newArgs)    } else {      // 普通方式调用,将函数内部的 this 替换为 context      fn.apply(context, newArgs)    }  }  // 支持 new 调用  newFunc.prototype = Object.create(fn.prototype)  return newFunc}// testconst myName = { name: 'Jack' }function say() {  const [age, height] = arguments  console.log(`My name is ${this.name}, My age is ${age}, My height is ${height}`)}const mySay = say.myBind(myName, 16, 170)mySay() // My name is Jack, My age is 16, My height is 170

10、instanceof

function myInstanceOf(obj, Fn) {  // 判断构造函数 Fn 是否出现在 obj 的原型链上  let proto = Object.getPrototypeOf(obj)  while (proto) {    if (proto === Fn.prototype) return true    proto = Object.getPrototypeOf(proto)  }  return false}

11、new

function myNew(Fn, ...args) {  const obj = new Object()  obj.__proto__ = Fn.prototype  // 将构造函数内部的 this 替换为新对象,并执行构造函数方法  const res = Fn.apply(obj, args)  if (typeof res === 'object' && res !== null) {    // 如果构造函数有返回值,且类型为 object, 则把这个值返回    return res  } else {    return obj  }}

12、统计页面中所有标签的种类和个数

function getTagCount() {  // 获取页面上所有标签元素  const tags = document.getElementsByTagName('*')  const tagNames = []  for (const val of tags) {    // 把所有标签名转为小写,添加到数组中    tagNames.push(val.tagName.toLocaleLowerCase())  }  const res = {}  for (const val of tagNames) {    if (!res[val]) {      res[val] = 1    } else {      res[val]++    }  }  return res}// testconsole.log(getTagCount()) // { html: 1, head: 1, body: 1, div: 2, script: 1 }

以上就是“常用web前端手写功能实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

常用web前端手写功能实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

常用web前端手写功能实例分析

今天小编给大家分享一下常用web前端手写功能实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、Promise.all
2023-07-02

web前端实例分析

这篇文章主要介绍了web前端实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web前端实例分析文章都会有所收获,下面我们一起来看看吧。正文这题的规则是这样的给定有一个 Add 函数,要支持以下形式的调用A
2023-06-27

web前端面试题实例分析

今天小编给大家分享一下web前端面试题实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。面试官:页面导入样式时,使用 l
2023-07-05

高频web前端面试题实例分析

本篇内容主要讲解“高频web前端面试题实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“高频web前端面试题实例分析”吧!面试官:请你简述 var、let、const 三者之间的区别?我:呃
2023-07-05

web前端面试题实例代码分析

这篇文章主要讲解了“web前端面试题实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端面试题实例代码分析”吧!面试官:给定一个元素,如何实现水平垂直居中?我:呃~,针对这个
2023-07-05

web前端面试题实例题目分析

今天小编给大家分享一下web前端面试题实例题目分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。面试官:请你谈一下自适应(适
2023-07-05

web前端开发中的while循环实例分析

今天给大家介绍一下web前端开发中的while循环实例分析。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。while循环while(循环终止条件){}案例 案例
2023-06-05

web前端面试问答题实例代码分析

这篇文章主要介绍“web前端面试问答题实例代码分析”,在日常操作中,相信很多人在web前端面试问答题实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”web前端面试问答题实例代码分析”的疑惑有所帮助!
2023-07-05

web前端高频面试题实例代码分析

本篇内容介绍了“web前端高频面试题实例代码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!面试官:请你谈谈JS的this指向问题我:呃~
2023-07-05

Python标准库os库的常用功能实例分析

本篇内容主要讲解“Python标准库os库的常用功能实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python标准库os库的常用功能实例分析”吧!1、目录操作1.1、获取当前目录# co
2023-07-02

JS前端面试数组扁平化手写flat函数示例分析

本文小编为大家详细介绍“JS前端面试数组扁平化手写flat函数示例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS前端面试数组扁平化手写flat函数示例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。题
2023-07-02

SpringBoot+Vue前后端分离实现审核功能的示例

SpringBoot+Vue前后端示例展示如何实现审核功能,包括后端实体、服务、SpringSecurity配置和前端组件。后端使用Java和SpringBoot,定义了审核实体、仓库和服务。前端使用Vue.js,创建了组件、模板和数据模型,并连接到后端服务。集成包括定义RESTAPI、设置Vue路由和注册审核组件。该示例提供了可扩展、安全和用户友好的解决方案,使开发人员能够轻松地将审核功能添加到他们的应用程序中。
SpringBoot+Vue前后端分离实现审核功能的示例
2024-04-02

Web前端性能优化之资源合并与压缩的示例分析

这篇文章将为大家详细讲解有关Web前端性能优化之资源合并与压缩的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。资源合并与压缩两个目的减少http请求数量减少请求资源的大小google首页案例学习h
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录