编程题
鱼叔子
黑夜,留给我们想象的空间;白天,为之梦中幻想而奋斗。
展开
-
第九篇《如何使用 JS 实现发布订阅器》
class Event { events = {} emit (type, ...args) { const listeners = this.events[type] for (const listener of listeners) { listener(...args) } } on (type, listener) { this.events[type] = this.events[type] || [] this.event原创 2021-11-24 11:03:01 · 537 阅读 · 0 评论 -
第八篇《JS 实现两个大数相加》
当有两个整数 a 和 b ,在通常情况下我们有“+”运算符对其进行相加运算:let sum = a + b; 但是 JS 在存放整数的时候是有一个安全范围的,一旦数字超过这个范围便会损失精度。我们不能拿精度损失的数字进行运行,因为运算结果一样是会损失精度的。所以,我们要用字符串来表示数据!(不会丢失精度)JS 中整数的最大安全范围可以查到是:9007199254740991假如我们要进行 9007199254740991 + 1234567899999999999我们要先准备两个字符串变原创 2021-11-24 10:53:38 · 205 阅读 · 0 评论 -
第七篇《如何实现无限累加的一个函数》
function sum (...args) { const f = (...rest) => sum(...args, ...rest) f.valueOf = () => args.reduce((x, y) => x + y, 0) return f}const a = sum(1, 2, 3).valueOf() //6const b = sum(2, 3)(2).valueOf() //7const c = sum(1)(2)(3)(4).valueOf()原创 2021-11-24 10:51:51 · 285 阅读 · 0 评论 -
第六篇《实现一个数组扁平化的函数 flatten》
function flatten (list, depth = 1) { if (depth === 0) return list return list.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b, depth - 1) : b), [])}const a = flatten([1, 2, 3, [4, [5, 6]]])const b = flatten([1, 2, 3, [4, [5, 6]]], 2)con原创 2021-11-24 10:46:20 · 169 阅读 · 0 评论 -
第五篇《如何实现一个 ORM 类似的 find 链式调用》
const data = [ {userId: 8, title: 'title1'}, {userId: 11, title: 'other'}, {userId: 15, title: null}, {userId: 19, title: 'title2'}];function find (data) { return { data, where (match) { this.data = this.data.filter((item) =>原创 2021-11-24 10:43:44 · 159 阅读 · 0 评论 -
第四篇《如何实现一个数组洗牌函数 shuffle》
function shuffle (list) { const len = list.length let result = [...list] for (let i = len - 1; i > 0; i--) { const swapIndex = Math.floor(Math.random() * (i + 1)); [result[i], result[swapIndex]] = [result[swapIndex], result[i]] } retur原创 2021-11-24 10:41:39 · 384 阅读 · 0 评论 -
第三篇《实现千位分隔符》
将普通的数字转换为带千位分隔符格式的数字字符串是一个非常常见的问题,千位分隔符格式的规则是数字的整数部分每三位一组,以“,”分节。小数部分不分节 。示例:19,351,235.235767这里有几个常见的实现方法。1.方法一实现思路是将数字转换为字符数组,再循环整个数组, 每三位添加一个分隔逗号,最后再合并成字符串。因为分隔符在顺序上是从后往前添加的:比如 1234567添加后是1,234,567 而不是 123,456,7 ,所以方便起见可以先把数组倒序,添加完之后再倒序回来,就是正常的顺序了。要原创 2021-11-22 14:47:29 · 498 阅读 · 0 评论 -
第二篇《实现 add(1)(2)(3)》
前言本文主要从 3W (what, how, why) 角度出发通俗易懂的解释一下 什么是函数柯里化,以及怎么用三行代码来实现 add(1)(2)(3) 这个很常见的面试题。什么是函数柯里化(curry)函数柯里化(curry)是函数式编程里面的概念。curry的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。简单点来说就是:每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。举个???? 将下面接受两个参数的函数改为接受一个参数的函数。con原创 2021-11-22 14:46:06 · 308 阅读 · 0 评论 -
第一篇《笔试》
一道算法题一共10颗糖,每次拿1颗或2颗,问有多少种方法?例:1,1,1,1,1,1,1,1,1,1为一种2,2,2,2,2为一种function test(n) { if(n == 1){ return 1 } else if(n == 2){ return 2 } else{ return test(n - 1) + test(n - 2) }}console.log(test(10));f(n) = f(n-1) + f(n-2)原创 2021-11-22 14:43:53 · 423 阅读 · 0 评论