![](https://img-blog.csdnimg.cn/20210111203927936.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
手撕代码题
记录一些手撕
IamSmaLLR.
这个作者很懒,什么都没留下…
展开
-
广度/深度优先遍历DOM树的结点
function bfs(){ let result = [] let root = document.querySelector('body') let stack = [root] let temp = [] let len while(len=stack.length){ for(let i=0;i<len;i++){ let node = stack.shift() temp.push(node.nodeName) if(node.chi.原创 2021-03-07 21:00:50 · 462 阅读 · 0 评论 -
实现一个执行多次的有间隔的定时器函数
//使下面调用代码能正常工作const repeatFunc = repeat(console.log, 4, 3000)repeatFunc("helloworld")//会输出四次helloworld,每次间隔3s答案: function repeat (func, times, wait) { return async function(...arg){ for(let i=0;i<times;i++){ await new Promise(function原创 2021-03-04 15:20:05 · 680 阅读 · 1 评论 -
js定义一个常量属性
1.Object.freeze()(递归)// constantize实现递归freezevar constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( key => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } });}var Obj = { name原创 2021-03-04 14:03:11 · 488 阅读 · 1 评论 -
实现一个延迟执行队列
实现一个延时执行队列, 要求分别在 1,3,4 秒后打印出 “1”, “2”, “ 3"class Queue{ constructor(){ this.taskList = [] } task(delay,fn){ function callback(){ return new Promise(function(res,rej){ setTimeout(() => { fn() res() }, delay); }) } thi原创 2021-03-02 21:02:51 · 421 阅读 · 0 评论 -
判断是否存在循环引用
var a = { b: null, c: null }; a.b = a; a.c = a.c;function judge (obj){ for(let i in obj){ if(typeof obj[i] === 'object' && obj === obj[i]){ return true } } return false}原创 2021-03-02 20:41:49 · 559 阅读 · 0 评论 -
手写Vue观察者模式
// 发布者-目标 class Dep { constructor () { // 记录所有的订阅者 this.subs = [] } // 添加订阅者 addSub (sub) { if (sub && sub.update) { this.subs.push(sub) } } // 发布通知 notify ...原创 2021-03-02 20:07:48 · 169 阅读 · 0 评论 -
手写一个发布-订阅模式EventEmitter
var Observer = (function () { //防止消息队列被暴漏而被篡改所以将消息容器作为静态私有变量保存 var __messages = {}; return { //注册信息接口 r...原创 2021-01-10 10:12:05 · 300 阅读 · 0 评论 -
手写异步调度器
class Scheduler {constructor(maxNum) {this.taskList = [];this.count = 0;this.maxNum = maxNum;}async add(promiseCreator) {if (this.count >= this.maxNum) {await new Promise((resolve) => {this.taskList.push(resolve)})}this.count ++;const r.原创 2021-02-23 23:58:39 · 294 阅读 · 0 评论 -
手写new
function Dog(name){ this.name = name}Dog.prototype.sayName = function(){ console.log(this.name)}// 上面是本身Dogfunction _new(fn,...args){ // ...args为ES6展开符,也可以使用arguments //先用Object创建一个空的对象, const obj = Object.create(fn.prototype) //fn.原创 2021-02-27 23:25:05 · 94 阅读 · 0 评论 -
手写实现call和apply
// callFunction.prototype.myCall = function(thisArg, ...args) { const fn = Symbol('fn') // 声明一个独有的Symbol属性, 防止fn覆盖已有属性 thisArg = thisArg || window // 若没有传入this, 默认绑定window对象 thisArg[fn] = this // this指向调用call的对象,即我们要改变th原创 2021-02-23 21:16:21 · 129 阅读 · 0 评论 -
setTimeout模拟setInterval
var i=0;setTimeout(function () { console.log(i++);//放执行的任务 setTimeout(arguments.callee, 1000);}, 1000);arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。...原创 2021-02-24 00:11:56 · 105 阅读 · 0 评论 -
手写深拷贝
function fn(obj) { if(typeof obj !== 'object' || obj === null) return var newObj = obj instanceof Array ? []:{} for(var key in obj) { if(obj.hasOwnProperty(key)){ if(typeof obj[key] === 'object'){ newObj[key] = fn(obj[key]) }//如果检测某一项是一个对象原创 2021-02-22 22:48:50 · 104 阅读 · 0 评论 -
嵌套数组拍平(数组扁平化)
方法1:直接调用已有flat函数var arr = [1,[2,3],[4,[5,6]]]var arr_flat = arr.flat(Infinity)flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。方法2:使用toString()方法var arr = [1,[2,3],[4,[5,6]]]var arr_flat = a原创 2021-01-08 18:26:05 · 1421 阅读 · 0 评论 -
赋值/深浅拷贝区别
https://www.cnblogs.com/chengxs/p/10788442.html var arr = [true,1,'str',{ a: 1}] console.log(arr) //[true, 1, "str", {…}] var a = JSON.parse(JSON.stringify(arr)) console.log(a) //[true, 1, "str", {…}] a.splice(0,2) console.log(a) //["str", {…}原创 2021-01-09 11:02:52 · 182 阅读 · 0 评论 -
手写事件代理(兼容IE浏览器)
<div id="btns"> <button data-id="1">按钮1</button> <button data-id="2">按钮2</button> <button data-id="3">按钮3</button> <button data-id="4">按钮4</button> <div>666</div> </div>.原创 2021-02-19 23:11:04 · 96 阅读 · 0 评论 -
手写reduce,使用reduce模拟map
let arr = [1,2,3] Array.prototype.myReduce = function(callback,initValue){ let arr = this for(let i=0;i<arr.length;i++){ initValue = callback(initValue,arr[i],i,arr) } return initValue } let sum1 = arr.myReduce((result,item,index..原创 2021-02-18 23:19:55 · 271 阅读 · 0 评论 -
10w数组求最大值不卡顿
async function findMax(largeList){ return new Promise((resolve,reject) =>{ requestIdleCallback(()=>{ try{ let max...原创 2020-12-28 17:44:19 · 181 阅读 · 0 评论 -
手写bind
if (!Function.prototype.bind) {Function.prototype.bind = function () {var self = this, // 保存原函数context = [].shift.call(arguments), // 保存需要绑定的this上下文args = [].slice.call(arguments); // 剩余的参数转为数组r...原创 2020-09-29 05:54:27 · 54 阅读 · 0 评论 -
input手写实现一个双向绑定
let test = {} Object.defineProperty(test,'value',{ get(){ return test._value; }, set(newValue){ test._value = newVa...原创 2020-12-28 22:17:39 · 704 阅读 · 0 评论 -
原生ajax封装成promise
var myNewAjax = function(url){ return new Promise(function(resolve,reject){ var xhr = new XMLHttpRequest() xhr.open('get',url) xhr.send(data) ...原创 2020-09-23 16:41:25 · 270 阅读 · 0 评论 -
柯里化(不完全函数)实现add函数
//Currying 柯里化 Partial Function 不完全函数 function add() { var tmpSlice = [].slice, params = tmpSlice.apply(arguments); function currying() { var arr = tmpSlice.apply(arguments); params = params.concat(arr); return currying; } currying.t.原创 2021-01-08 18:27:39 · 578 阅读 · 0 评论 -
手写Promise类(all/race)
#手写Promisehttps://zhuanlan.zhihu.com/p/144058361 完整版(含链式调用) class promise{ constructor(fn){ //初始pending状态 this.status = 'pending'; //成功fulfilled状态,保存value值 this.value = undefined; //拒绝rejected状态,保存reason值 this.reason = undefin原创 2021-01-08 18:24:56 · 136 阅读 · 0 评论 -
手写instanceof,判断对象之间关联性
function instance_of(L,R){ const baseType = ['string','number','boolean','undefined','null','symbol']; if(baseType.includes(typeof L)) { return false } let RP = R.prototype; let Lp = L.__proto__; while(true){ if(Lp === null){原创 2021-01-08 18:26:58 · 85 阅读 · 0 评论 -
ES5手写一个迭代器(iterator)
//使用@@iterator对象可以创造一个迭代器, let iterator = number[Symbol.iterator]();// console.log(iterator.next().value); function createIterator(items){ var i = 0; return { next:function(){ var done = (i>=items.length); var原创 2021-01-09 10:57:44 · 346 阅读 · 0 评论 -
手写一个倒计时效果
//<div id='date'><div> var end = new Date('2021-1-1 00:00'); function countDone(){ var now = new Date(); var remainder = end - now; if(remainder<0){ return; } var day = Math.floor(remainder/1000/60/60/24); //天...原创 2021-01-09 11:00:59 · 375 阅读 · 0 评论