前置instanceof 关键字会判断右侧的构造函数的 prototype 属性是否出现在左侧实例对象的原型链上所有对象都具有__proto__ 属性,它会指向创建它的构造函数的prototype属性MDN鼓励使用getPrototypeOf 来代替 proto 的属性访问要求obj 可以是任意参数,即它也可能是null和undefined题解var checkIfInstanceOf = function (obj, classFunction) { if (obj === null || obj === undefined || !(classFunction instanceof Function)) return false; // 拿到对象的原型 let objProto = Object.getPrototypeOf(obj); // 如果 当前原型往上查找 还是不等于 prototype原型 则继续查找 while (objProto !== classFunction.prototype) { objProto = Object.g
这一题考察排序的实现,最常见的就是冒泡,第一个学的也是冒泡..这一题根据给定的数组和函数,返回一个排序后的数组,fn 会返回数字,它将决定排序后的数组的排序顺序。要求排序数组要根据fn返回的数组进行升序排序不使用sort方法进行排序快速排序题解var sortBy = function(arr,fn){ let len = arr.length //结束排序的条件 if(len <= 1) return arr //取中间索引 let minIndex = Math.floor(len / 2) //取中间数 let mid = arr[minIndex] //取左右数组 用于每次的分组和排序 let left = [] let right = [] for(let i = 0; i < len; i++){ if(fn(arr[i]) === fn(mid)) continue //中间基数直接跳过 else if(fn(arr[i]) < fn(mid)) left.push(arr[i]) /
斐波那契数列要求当前数是前两个数之和的一种排序这一题比较有意思,需要使用生成器函数来完成,生成器函数具有以下特性:基于迭代器协议运作生成器函数不会马上执行,而是等待迭代指令函数内部的执行流程将根据yield关键字往下走,无视函数内部原有的执行流程/** * const gen = fibGenerator(); * gen.next().value; // 0 * gen.next().value; // 1 */题目要求这个数列的前几个数字是 0, 1, 1, 2, 3, 5, 8, 13最后一个数≤50题解var fibGenerator = function* () { let [a, b] = [0, 1]; yield a; //第一次先返回1 while (true) { [a, b] = [b, a + b]; //每次调用都让B的值进行求和,A的值取上一次求和后的B值 if (a <= 50) yield a; //要求2 } }; let p1 = fibGenerator(); console.log(p1.nex
这一题要求实现一个Compose函数,属于高阶函数中的一种应用,比它更复杂一些的就是函数柯里化啦~要求第一次调用时接收的是一个函数数组返回一个新的函数,并且这个函数就是函数数组的复合函数/** * const fn = compose([x => x + 1, x => 2 * x]) * fn(4) // 9 */题解这里不使用Reduce方法,采用原始循环来解var compose = function (functions) { return function (x) { for (let i = functions.length - 1; i >= 0; i--) { x = functions[i](x); } return x; }; };
这一题要求我们模拟实现类似Reduce的效果要求不使用数组下的Reduce方法长度为0的情况下返回init值应用操作val = fn(init,nums[n])、val = fn(val,nums[n])题解var reduce = function (nums, fn, init) { if (!nums.length) return init; //满足条件2 let initRes = init; nums.forEach((num) => (initRes = fn(initRes, num))); return initRes; };
Harexs
风归云动,天河泻梦