开开心心做几道JavaScript机试题 - 02

2023-05-16

前集回顾

我们在开开心心做几道JavaScript机试题 - 01中吐了槽,也顺势展开了机试题之旅,本章我们暂时压抑自己的吐槽之心,继续就题目前行。仍然希望对各位正确认识JavaScript这门语言,已经在面试过程中遇到这些问题时,如何思考!

项目地址:fe-interview

答题之路

11 - 请尝试完成一个类似'_.find'的模块

图片描述

本题主要考查对数组的工具函数的理解、认识。很多朋友习惯了遇事儿就喷一堆for loop在那恶心人,忽略变量污染、不必要的遍历操作、含义模糊等问题可能带来的潜在隐患。对抱有这种错误认识的朋友,只要考考这些常见的数组快捷函数的实现原理,原形毕露!^^

答案:

var find = function(array, func) {
    for (var i = 0; i < array.length; i++) {
        if (func(array[i], i)) {
            return array[i];
        }
    }
};

module.exports = find;

关于这一点,可以阅读:Functional programming in Javascript: map, filter and reduce

12 - 请尝试完成一个类似'_.findlast'的模块

图片描述

本题和上题的唯一区别在于,寻找最后一个符合条件的指定元素

答案:

var findlast = function(array, func) {
    for (var i = array.length - 1; i > -1; i--) {
        if (func(array[i], i)) {
            return array[i];
        }
    }
};

module.exports = findlast;

13 - 请尝试完成一个查找出现频率最高元素的模块

图片描述

这个考察的就是对数组和literal object的组合使用

答案:

var findmost = function(array, identity) {
    var occurrence = {};
    var most;
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        var id = identity ? identity(item) : item;
        if (!occurrence[id]) {
            occurrence[id] = {count: 1, raw: item};
        } else {
            occurrence[id].count++;
        }
        if (!most || (most !== id && occurrence[id].count > occurrence[most].count)) {
            most = id;
        }
    }
    return occurrence[most].raw;
};

module.exports = findmost;

我只用了for loop形式,欢迎更简洁写法的PR

14 - 请尝试完成一个类似'_.difference'的模块

图片描述

本题考查了两个数组的比较,查找第二数组里没有出现的第一个数组的元素。其中对isNaN有比较细节的针对

答案:

var isNaN = Number.isNaN;
var difference = function(arr1, arr2) {
    return arr1.reduce(function(previous, i) {
        var found = arr2.findIndex(function(j) {
            return j === i || (isNaN(i) && isNaN(j));
        });
        return (found < 0 && previous.push(i), previous);
    }, []);
};

module.exports = difference;

我的答案用了reduce来获取最终结果;如果有朋友对found < 0 && previous.push(i)不明白,可以看:短路求值。如果对,的使用不了解,那说明你没看上一章

15 - 请尝试完成一个类似'_.camelCase'的模块

图片描述

本题考查对字符串的各种处理手段

答案:

var camelcase = function(str) {
    return str.toLowerCase()
        .replace(/(\s+|-+)(.)/g, function(matched, separator, letter) {
            return letter.toUpperCase();
        });
};

module.exports = camelcase;

我这里用了一套组合技,先toLowerCase,再配合正则表达式,用一个replace结束战斗

16 - 请尝试完成一个类似'_.times'的模块

图片描述

本题考查了对数组便捷函数的理解认识,重点在于第二个参数是callback,很多人都被StringBoolean给吓到了,想不通为什么结果会是那个样子。其实String和Boolean都是构造函数,可以直接调用的。

答案:

var times = function(n, func) {
    return Array
        .apply([], new Array(n))
        .map(function(item, index) {
            return func(index);
        });
};

module.exports = times;

17 - 请尝试完成一个类似'_.filter'的模块

图片描述

不多说了,依旧围绕数组。虽然数组的题比较多,但在面试过程中可以选择做答,不必全部都写

答案:

var filter = function(arr, iteratee) {
    return arr.reduce(function(previous, item) {
        return (iteratee(item) && previous.push(item), previous);
    }, []);
};

module.exports = filter;

我的答案仍然利用了reduce和短路求值

18 - 请尝试完成一个简单的thunkify函数

图片描述

这个题目对部分朋友来说,可能又过分了。但相信我,题目不是为了羞辱谁,而是考察关于JavaScript,你到底知道多少?函数式编程不是写Javascript的必需条件,但函数式表达的简洁性,对于代码更深入的理解还是很有帮助的。

关于什么是thunk?我们先来看看简单定义:“一个封装了特定行为使其可以延迟执行的函数,通常我们称之为thunk”,如果希望了解更多关于thunk的内容,看Thoughts On Thunks

答案:

var thunkify = function(func) {
    return function() {
        var _this = this;
        var args = Array.prototype.slice.call(arguments);
        return function(cb) {
            try {
                func.apply(_this, args.concat([cb]));
            } catch (e) {
                cb(e);
            }
        };
    };
};

module.exports = thunkify;

关于arguments为什么需要Array.prototype.slice.call(arguments)转换成Array,看arguments

19 - 请尝试完成一个类似'_.zipObject'的模块

图片描述

答案:

var zipobject = function(arr1, arr2) {
    return arr1.reduce(function(previous, key, index) {
        return (previous[key] = arr2[index], previous);
    }, {});
};

module.exports = zipobject;

本题考查数组合并/压缩,我用了reduce来处理。通过最近这几题可以看出来,reduce真的能做很多事情哦!

20 - 请尝试完成一个类似'_.once'的模块

图片描述

本题考查对“缓存”的理解,很多人会被这个概念唬住,以为又是什么浏览器缓存啦,服务器缓存啦,甚至有人想到了redismemcached等工具,然后被吓得半死。其实没那么牛逼,你就是写一个变量,只要不销毁,都可以叫缓存。

答案:

var once = function(func) {
    var value,
        executed;
    return function() {
        var args = Array.prototype.slice.call(arguments);
        if (!executed) {
            executed = true;
            value = func.apply(this, args);
            return value;
        }
        return value;
    };
};

module.exports = once;

通过设置一个executed的标记来判断该函数是否已经执行过了

21 - 请尝试完成一个类似'_.flatMap'的模块

图片描述

本题考查对map的理解。

答案:

var flatmap = function(array, iteratee) {
    return Array.prototype.concat.apply([], array.map(iteratee));
};

module.exports = flatmap;

一个小技巧,对于二维数组,利用concat函数处理,代码更简洁

22 - 请尝试完成一个简单的middleware模块

图片描述

多少人写了很久的express,结果搞不清middleware是什么,怎么工作的,如何书写middleware,怎么使用middleware。这一切都源于对“中间件”这个概念的模糊,以及对express中“中间件”的实现原理的不解

答案:

var Middleware = function() {
    this.pool = [];
};

Middleware.prototype.use = function(cb) {
    this.pool.push(cb.bind(this));
};

Middleware.prototype.start = function(cb) {
    var _this = this;

    var pullOut = function() {
        if (_this.pool.length === 0) {
            return cb.call(_this);
        }
        _this.pool.shift()(pullOut);
    };

    pullOut();
};

module.exports = Middleware;

关于middleware的详细介绍,可以看guide。

23 - 请尝试完成一个URL解析模块

图片描述

本题考查对URl的理解,各部分都是什么意思。在我们过往的经历中,经常发现候选人搞错一些概念,譬如:什么是query parameterprotocol指的是哪一段,domain又是哪一段,我们常说的hash/fragment是什么?分清楚各部分是什么,方便分解这道题

关于URL,你可能想看到如下图解:

图片描述

答案:

var urlparser = function(url) {
    var result = /^(?:(https?):)\/\/([\.\-\w]+)(?:([\/\w]+))?(?:\?([\w=&]+))?$/.exec(url);

    var parsed = {protocol: result[1], host: result[2]};

    if (result[3]) {
        parsed.path = result[3];
    }

    if (result[4]) {
        parsed.query = result[4].split('&')
            .map((query) => query.split('='))
            .reduce((params, pairs) => (params[pairs[0]] = pairs[1], params), {});
    }

    return parsed;
};

module.exports = urlparser;

这个答案我用了正则和mapreduce,略显臃肿。强烈欢迎更优解法

24 - 请尝试完成一个类似'_.throttle'的模块

图片描述

这又是个有故事的题,关于“节流阀”,是一种降低计算频率的处理。最常见的使用场景:当页面滚动时计算某一个值,相信如果你直白的在onScroll里写了计算行为后会发现,每移动一个像素都会触发一次计算,如果计算量还有一点大的话,卡不死你。这时候就用到了节流阀的技巧。关于“节流阀”更多详情,请看throttle

答案:

var throttle = function(func, wait) {
    var last,
        timer;
    return function() {
        var args = Array.prototype.slice.call(arguments);
        var _this = this,
            now = new Date().getTime();
        if (typeof last === 'undefined') {
            last = now;
            return func.apply(_this, args);
        }
        clearTimeout(timer);
        if (now - last > wait) {
            last = new Date().getTime();
            return func.apply(_this, args);
        }
        timer = setTimeout(function() {
            last = new Date().getTime();
            func.apply(_this, args);
        }, wait + last - now);
    };
};

module.exports = throttle;

25 - 请尝试完成一个类似angularjs的依赖注入模块

图片描述

用过AngularJS的朋友肯定都见识到了“依赖注入”的威力(当然如果你是java转型的程序员,更应该有体会),依赖注入是一种解藕手段,我们在java中通常如是介绍:“依赖注入是实现IoC(控制反转)一种方式”。关于依赖注入,你也可以看手写依赖注入

答案:

var Di = function() {
    this.instanceStore = {};
};

Di.prototype.register = function(name, inst) {
    this.instanceStore[name] = inst;
};

Di.prototype.run = function(arr) {
    var _this = this,
        lastIndex = arr.length - 1;

    arr[lastIndex].apply(null,
        arr.slice(0, lastIndex)
            .map(function(name) {
                var Inst = _this.instanceStore[name];
                if (!Inst) {
                    throw new Error('You are expecting a non-exist instance');
                }
                return typeof Inst === 'function' ? new Inst() : Inst;
            }));
};

module.exports = Di;

注意我在run实现里的typeof Inst === 'function' ? new Inst() : Inst;使得如果注册的是一个构造函数,那么每次使用都会注入一个新的实例,这和AngularJS里使用单例的策略不同,这里留下一个问题,如果我希望使用单例策略,答案要做如何修改?

这是余下的15个题目,随时欢迎PR,欢迎指正,欢迎优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开开心心做几道JavaScript机试题 - 02 的相关文章

  • 【性能测试】利用IxChariot测试路由器吞吐量(wan to lan & lan to wan)

    写在前面 因项目原因 xff0c 本人对路由器吞吐量测试进行了学习探索 在学习过程中 xff0c 了解到IxChariot这一工具 xff0c 而在实践中 xff0c 也遇到一些问题 xff0c 花了较多时间去尝试和摸索 在此本人将这次实践
  • 通用文本标注工具 labelme

    欢迎大家前往腾讯云社区 xff0c 获取更多腾讯海量技术实践干货哦 作者 xff1a 理查德 导语 一个支持文本类目标注和关键词打分的通用标注工具 xff0c 为文本分类模型和关键词抽取任务提供训练和测试数据 by 慕福楠 amp 孙振龙
  • 干货|基于CPU的深度学习推理部署优化实践

    背景介绍 随着人工智能技术在爱奇艺视频业务线的广泛应用 xff0c 深度学习算法在云端的部署对计算资源 xff0c 尤其是 GPU 资源的需求也在飞速增长 如何提高深度学习应用部署效率 xff0c 降低云平台运行成本 xff0c 帮助算法及
  • Keycloak授权服务指南

    为什么80 的码农都做不了架构师 xff1f gt gt gt 本文译自Keycloak官方文档 xff0c 原文链接 对应版本为5 0 概述 Keycloak支持细粒度的授权策略 xff0c 并可以对这些策略进一步组合 xff0c 如 x
  • postgresql的substr()函数

    为什么80 的码农都做不了架构师 xff1f gt gt gt code select substr 39 1234 39 0 3 as re code 如果是pg xff1a 得到的结果是12 如果是oracle xff1a 得到的结果是
  • 【docker】查看docker镜像的版本号TAG,从远程仓库拉取自己想要版本的镜像

    要想查看镜像的版本好TAG 需要在docker hub查看 地址如下 xff1a https hub docker com r library 进入之后 xff0c 在页面左上角搜索框搜索 xff0c 例如搜索redis 搜索完成如下 xf
  • Windows下慎用内核隔离

    1 开启内核隔离后只能通过注册表关闭 2 开启内核隔离后 默认会启动hybrid v 这个东西和虚拟机是冲突的 这样就用不了虚拟机了 3 解决方法 关闭内核隔离后 再关闭已经开启的hybrid v 基本参考下面 可能要重复几次才能有效的关闭
  • EntLib 3.1学习笔记(4) : Logging Application Block

    zh http www microsoft com china MSDN library enterprisedevelopment softwaredev dnpag2logging mspx mfr 61 true en http ms
  • linux开机启动

    linux 有自己一套完整的启动体系 xff0c 抓住了 linux启动的脉络 xff0c linux的启动过程将不再神秘 阅读之前建议先看一下附图 本文中假设inittab中设置的init tree为 xff1a etc rc d rc0
  • 设置TextBox控件readOnly="True",后台无法取得客户端TextBox中值的解决方法

    在TextBox中设置属性 ContentEditable 61 34 false 34 即可 例 xff1a lt asp TextBox Id 61 34 txt DeptName 34 runat 61 34 server 34 Te
  • matlab练习程序(双边滤波)

    双边滤波模板主要有两个模板生成 xff0c 第一个是高斯模板 xff0c 第二个是以灰度级的差值作为函数系数生成的模板 然后这两个模板点乘就得到了最终的双边滤波模板 第一个模板是全局模板 xff0c 所以只需要生成一次 第二个模板需要对每个
  • hive:导出数据记录中null被替换为\n的解决方案

    在hive中 xff0c 一般情况下通过 1 use my hive db 2 set hive merge mapfiles 61 true 3 set hive merge mapredfiles 61 true 4 set hive
  • STP试验的综合应用

    实验环境 xff1a Catalyst 2950 24 S1 SwA S2 SwB S3 SwC S4 SwD 实验目的 xff1a 1 利用VTP协议实现VLAN配置的一致性 2 通过PVST的配置实现交换网络的负载分担 其次实现冗余备份
  • Ubuntu12.04LTS安装好后是空白桌面的解决步骤

    安装完毕启动后 xff0c 明显慢的要死 xff0c 登陆后竟然是一个空白的桌面环境 xff0c Ctrl 43 Alt 43 T 根本没有任何反应 唯一的反应就是右键能够创建文件和文档 同时打开的窗口没有最大化 xff0c 最小化及关闭按
  • could not execute menu item系统找不到指定的文件

    Wamp3 0 6 64bit xff0c 系统任务栏图标 xff0c 左键 xff0c Apache菜单 xff0c httpd conf xff0c 报错 could not execute menu item 系统找不到指定的文件 根
  • 这么好用的U盘数据恢复软件,推荐!

    U盘受到了用户不同程度的青睐 xff0c 可以将临时要用的数据输入到U盘中 但是U盘在使用过程中 xff0c 也会出现一些突发情况 xff0c 让用户措手不及 xff0c 其中最常见的就属数据丢失 数据丢失的原因包括多种 xff0c 误删除
  • node+微信小程序实现商城案例

    说明 xff1a 1 本人也是初次完整使用小程序 xff0c 如有BUG或者不足的地方请在Issues或者本文下方留言 xff0c 作者会尽快修改 xff0c 谢谢 xff01 2 本项目适合初学者或者准备自学小程序的伙伴 小程序功能 xf
  • SpringBoot使用fastjson的JsonField注解序列化Bigdecimal

    代码 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmln
  • 网盘告急 亚信安全Safesync让企业级数据存储吃下“定心丸”

    近日 xff0c 两条重磅消息登上新闻头条 xff1a 一则是360云盘由于无法解决盗版侵权等问题 xff0c 将于2017年2月1日起关闭云盘 xff1b 另一则是百度遭到渔具店老板 撞库 xff0c 50万账号被盗后又遭转卖 xff0c
  • android内存泄漏分析的一种方式

    最近在处理项目的拷机问题 xff0c 发现在测试24小时内 xff0c 都是正常的 xff0c 但是超过24小时后 xff0c 重启一大片 xff0c 让人抓狂 分析了logcat打印 xff0c 发现重启是因为系统服务已经被watchdo

随机推荐

  • 29个运维经典面试题

    前言 这篇博文参考阿铭linux 28个运维经典面试题 xff0c 并对其中的一些题目进行扩展和解析 如有侵权 xff0c 请联系我删除 xff5e 再次感谢阿铭老师的分享 大家有空可以看看阿铭老师的教程 xff5e 第一题 xff1a L
  • win10下丢失msvcr110.dll解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 笔者尝试过的方法 xff1a 方法一 xff1a 360安全卫士 功能大全 搜索区查找 xff1a msvcr110 dll xff0c 回车键结束 选择第一个 xff0c
  • moment.js格式化日期,获取前一个月的时间

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 下载moment js 格式化当前日期 xff1a 显示结果为 xff1a 34 2017 09 20 15 35 52 34 moment new Date format
  • 在springboot中配置web.xml

    在springBoot中配置web xml中配置的servlet http www cnblogs com wangxiaomei p 8885470 html 转载于 https www cnblogs com lxcmyf p 1006
  • SQL字符串处理函数大全

    select语句中只能使用sql函数对字段进行操作 xff08 链接sql server xff09 xff0c select 字段1 from 表1 where 字段1 IndexOf 34 云 34 61 1 这条语句不对的原因是ind
  • 设计模式之(十五)职责链Chain of Responsibility

    Chain of Responsibility定义 Chain of Responsibility CoR 是用一系列类 classes 试图处理一个请求request 这些类之间是一个松散的耦合 唯一共同点是在他们之间传递request
  • 如何判断一个C++对象是否在堆上

    摘要 在帖子 34 如何判断一个C 43 43 对象是否在堆栈上 中 xff0c 又有人提出如何判断一个C 43 43 对象是否在堆上 阅读全文 Richard Wei 2012 05 12 14 30 发表评论 转载于 https www
  • 前端框架Vue、angular、React的优点和缺点,以及应用场景

    学习web前端开发中 xff0c 会有很多的框架 xff0c 那么目前流行的框架有哪些 xff0c 以及他们的优缺点和应用场景有哪些呢 xff1f 一 Vue js xff1a 其实Vue js不是一个框架 xff0c 因为它只聚焦视图层
  • AFNetworking(二)AFNetworking对form-data请求体的处理

    AFNetworking 发送 GET POST 等请求时可以直接将参数按照字典结构传入 xff0c 最终编码到 url 中或者是 body 实体中 xff0c 同时也支持按照 multipart form data 格式 xff0c 将多
  • Android原生SpeechRecognizer(语音识别)

    开篇先吐槽下 xff0c 在Android 平台开发原生的SpeechRecognizer真是难受的 xff0c 不像ios xff0c 无比轻松 xff0c 平台统一 由于Android 平台的碎片化问题比较严重 xff0c 各个厂商都有
  • shell 读取配置文件

    shell 读取配置文件来取参数的值 在许许多多 自动化 的脚本中 很学用 bin sh filepath 61 34 home test test txt 34 while read LINE do user 61 96 echo LIN
  • MFC 获取本机IP地址(多个网卡)

    szHostName 128 gethostname szHostName hostent pHost i pHost gethostbyname szHostName i pHost pHost h addr list i i CStri
  • python 网站文件及数据库备份脚本

    初学python xff0c 试着写了一份python网站文件备份和数据库备份的脚本 xff0c 功能是写出来了 xff0c 但感觉还是不太适应 xff0c 写得不太好 xff0c 以后还要努力哈 xff01 backup py读取back
  • Qt实现串口通信总结

    Qt实现串口通信总结 注意 xff1a Qt5发布之前 xff0c Qt实现串口通信一般是采用第三方类库qextserialport Qt5发布后自带了QtSerialPort 能够支持串口通信 1 Qextserialport类介绍 在Q
  • 开发中状态到底用数字还是字符串

    做了这么多年网站发现 xff0c 一个遗留下来的习惯是否需要变变 就是在设计数据库及数据结构的时候 xff0c 我们已经习惯了用数字来表示 xff0c 例如 xff1a 0表示正常 xff0c 1表示删除 但是 xff0c 这么设计有几个好
  • org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call...

    前言 本文中提到的解决方案 xff0c 源码地址在 xff1a springboot thymeleaf xff0c 希望可以帮你解决问题 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法 xff0c 又多此一举的
  • (Access denied for user 'root'@'slaver1' (using password: YES))

    1 问题描述 xff0c 启动azkaban的时候报如下所示的错误 之前使用azkaban是root用户 xff0c 今天使用hadoop用户进行配置和使用 xff0c 报这个错 xff0c 说是root连接mysql拒绝了 1 hadoo
  • 【Python实战】用代码来访问1024网站

    1024是一个好网站 首先 xff0c 此次实战系列的前提是您能科学的找到1024网站 xff01 我这里并不提供网站地址 xff0c 特此声明 xff0c 这里只是用计算机科学的态度和方法 xff0c 来分析一个问题 和1024网站没有任
  • js立即执行函数与分组操作符()的用法

    一 圆括号运算符 圆括号运算符也叫分组运算符 xff0c 它有两种用法 xff1a 如果表达式放在圆括号中 xff0c 作用是求值 xff1b 如果跟在函数后面 xff0c 作用是调用函数 把表达式放在圆括号之中 xff0c 将返回表达式的
  • 开开心心做几道JavaScript机试题 - 02

    前集回顾 我们在开开心心做几道JavaScript机试题 01中吐了槽 xff0c 也顺势展开了机试题之旅 xff0c 本章我们暂时压抑自己的吐槽之心 xff0c 继续就题目前行 仍然希望对各位正确认识JavaScript这门语言 xff0