![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
你应该掌握的js技巧
丹丹的小跟班
这个作者很懒,什么都没留下…
展开
-
将复杂对象扁平化处理
我们常见的一半都是将多维数组进行扁平化操作,但有时候我们也需要对对象进行类似操作,对象有可能是数组对象,也有可能是对象数组。//判断数据类型function typeJudge(val, type) { return Object.prototype.toString.call(val) === `[object ${type}]`}function objjectFlat(val, newObj) { if (typeJudge(val, 'Array')) { val.forEach(o原创 2022-02-17 09:46:03 · 226 阅读 · 0 评论 -
手写instanceof方法
instanceof原创 2022-01-07 16:07:20 · 612 阅读 · 0 评论 -
原生toFixed的bug
toFixed的bug解决原创 2021-11-17 17:18:21 · 145 阅读 · 0 评论 -
手写promise.all
promise.all在日常项目里经常会碰到,今天咋们手写下promise.all这个方法,并且探究下其中的细节。先来几个democonst demo1 = new Promise((resolve, reject) =>{ setTimeout(() => { resolve(1) }, 1000)})const demo2 = new Promise((resolve, reject) =>{ setTimeout(() => { resolve(2) }原创 2021-09-10 18:26:02 · 312 阅读 · 0 评论 -
手写new方法
手写new方法原创 2021-07-26 10:53:39 · 475 阅读 · 0 评论 -
数组去重方法集合
1.for循环 + indexOf() + push()function goRepeat(arr) { let newArr = []; for (var i = 0; i < arr.length; i++) { //将数组的每一项与新数组进行indexOf查询,若没有则添加进新数组,若有则不管 if (newArr.indexOf(arr[i]) == -1) { //不包含该值则返回-1 newArr.push(arr[i]); }原创 2021-07-14 16:59:23 · 157 阅读 · 0 评论 -
在时间段内获取该时间段的使用面积
最近做了一个项目中有一个需求:在选择的开始时间和结束时间段内,获取该时间段内的可用面积,并在添加面积的时候判断面积是否够用。这个需求是使用后端接口进行验证的,但过程中出现了很多问题,但当时考虑到需求的复杂性,所以我也没有去做前端验证,项目做完之后现在来思考这个需求应该怎么写。1. 首先封装一个判断月份返回每月天数的方法function calculationDays(year, month) { if (month > 12 || month < 1) { throw new Erro原创 2021-07-06 11:12:06 · 83 阅读 · 0 评论 -
数组扁平化
let arr = [1, 2, [1, 2, [1, 2]]]; 如何将数组实现扁平化操作?1. 利用for循环递归调用let newArr = []; function flatArr(arr) { for (let i = 0; i < arr.length; i++) { if (arr[i] instanceof Array) { newArr.concat(flatArr(arr[i])); } else { newA.原创 2021-07-06 10:52:23 · 105 阅读 · 0 评论 -
手写call与apply方法
Function.prototype.call = function (...arg) { // 1 判断context是否为object,如果是object就代表可能是Object 或者 null,如果不是就赋值一个空对象 let context = arg[0]; if (typeof context === "object") { context = context || window; // context 如果是null就会赋值为window } else { c原创 2021-07-06 10:36:49 · 71 阅读 · 0 评论 -
手写bind方法
自己封装一个bind方法,需要考虑以下几点:参数的获取(方法里面的参数和bind返回的函数的参数)this的保存apply或者call的使用返回待执行函数而不是执行函数Function.prototype.bind = function (...arg1) { //保存this,这里的this指的是test方法 let self = this; //取出第一个参数,也就是this的指向对象 let obj = arg1[0]; if (typeof obj === "obj原创 2021-07-06 10:31:21 · 442 阅读 · 0 评论 -
深浅拷贝总结
一直在上面栽跟头,今天总结下最常用的深拷贝方法1.Object.assign此方法是es6新推出来的方法,目的是将所有可枚举属性的值从一个或多个源对象分配到目标对象Object.assign(目标对象, 源对象)该方法参数可以有一个,或者是对个参数为一个时且为一个对象时,该方法会返回该对象参数为多个时,且参数都为对象,该方法会将源对象上的属性添加(重复的属性后面的对象会覆盖前面对象的属性)到目标对象。不会改变源对象。//注意目标对象不能为null或undefinedObject.assi原创 2021-07-06 09:13:33 · 83 阅读 · 0 评论 -
去字符串前后空格方法
1,使用正则let str = ' 123 4 'let backStr = str.replace(/^(\s*)|(\s*)$/g, '')console.log(backStr) // '123 4'2.trim方法trim() 方法会从一个字符串的两端删除空白字符。let str = ' 123 4 'let backStr = str.trim()consose.log(backStr) // '123 4'自定义方法function selfTri原创 2021-07-06 09:14:24 · 5585 阅读 · 0 评论 -
判断数据类型
判断数据类型的方法有很多,ypeof,instanceof 等。今天我们主要将Object.prototype.toString.call()进行数据类型的判断。该方法可以说是最准确最全面的判断数据类型的方法。(当然他也还是有不能判断自定义对象的问题存在的)//使用柯里化函数的方法function isType(type) { return function(val) { console.log(Object.prototype.toString.call(val)) return `[ob原创 2021-07-05 11:04:34 · 82 阅读 · 0 评论 -
封装map方法
map特性:1.参数一为回调函数,回调函数里面有三个参数,数组元素,下标和数组,参数二为回调函数的this指向。默认this指向全局。2.对稀缺数组跳过空元素,不进行处理。3.返回新数组。// map拥有两个参数,第一个是回调函数,第二个是this指向function selfMap(fn, context) { // 拿到数组 let arr = Array.prototype.slice.call(this) // 创建一个新的空数组进行存储 let mapArr = [] // 遍原创 2021-07-05 09:57:21 · 1126 阅读 · 0 评论 -
防抖与节流
一直以来都直接这两个函数,记了忘,记了忘,今天总结下日常开发过程中,滚动事件做复杂计算频繁调用回调函数很可能会造成页面的卡顿,这时候我们更希望把多次计算合并成一次,只操作一个精确点,JS把这种方式称为debounce(防抖)和throttle(节流)####首先看下例子<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <st原创 2021-07-05 09:56:18 · 76 阅读 · 0 评论