面试
文章平均质量分 66
Beijiyang999
这个作者很懒,什么都没留下…
展开
-
单线程 JavaScript 的异步机制与经典 for 循环面试题
从一个经典的 for 循环问题开始for (var i = 1; i <= 5; i++) { setTimeout( function timer() { console.log(i); }, i*1000)}输出是:每隔1秒,输出一个6,共5次。原理这样的输出,是由 JavaScript 的单线程及异步机制决定的。JavaScript 是单线...原创 2018-03-07 17:38:32 · 1056 阅读 · 2 评论 -
JavaScript 实现 filter() 方法函数
思路filter 方法接收两个参数:对每一项执行的函数 该函数接收三个参数: 数组项的值 数组项的下标 数组对象本身指定 this 的作用域对象filter 方法返回 执行结果为true的项组成的数组。代码表示:arr.filter(function(item, index, arr){}, context)实现由此,实现 fakeFilter...原创 2018-05-03 14:26:57 · 8892 阅读 · 0 评论 -
JavaScript 实现 reduce() 方法函数
思路与之前两篇文章( map()的实现 ,filter()的实现 )中的迭代方法不一样,reduce() 是归并方法。reduce 接收两个参数:第一个参数是在每一项上调用的函数 该函数接收 4 个参数: 前一个值 prev 当前值 cur 项的索引 index 数组对象 array第二个可选参数是作为归并基础的初始值reduce 方法返回一个最终的值。代码表示...原创 2018-05-03 20:40:01 · 13813 阅读 · 3 评论 -
几种常见的排序算法总结(JavaScript 描述)
本文讨论:冒泡排序、插入排序、希尔排序、简单搜索排序、快速排序、归并排序、堆排序。冒泡排序介绍冒泡排序比较任何两个相邻的项。如果前一个比后一个大,就交换它们。元素向上移动至正确的位置,看上去就像水中上升的气泡一样。代码function bubbleSort(arr) { let length = arr.length; let flag; ...原创 2018-05-06 00:49:02 · 425 阅读 · 0 评论 -
二分搜索 / 折半查找
查找/搜索算法中,顺序搜索没什么好说的,从二分搜索 / 折半查找开始。步骤选择中间值 (low+high) / 2如果它是目标值,bingo~如果大了,从其左边的一半找如果小了,从其右边的一半找如果找不到,返回 -1 或 null 等注意: 需要数组本身有序递归实现function binaryhSearch(arr, low, high, target) ...原创 2018-05-06 13:14:55 · 313 阅读 · 0 评论 -
JavaScript 实现 对象、数组、类数组通用的遍历方法 each
jQuery 的 each 方法jQuery 有个 each 方法,是对于对象、数组通用的遍历方法。具体的用法参考官方文档:.each()今天我们也来实现这样一个 each 方法。思路参数:参考 jQuery ,each 方法接收两个参数:要遍历的对象;要在其上执行的回调函数。逻辑:自然是要先判断其类型,是数组(类数组)就执行 for 循环(forEac...原创 2018-07-08 22:41:46 · 1059 阅读 · 0 评论 -
JavaScript 用一个一元函数精简地实现 ES6 的 findIndex 与 findLastIndex 方法
普通地实现 findIndex 与 findLastIndexES6 新增了 findIndex 与 findLastIndex 数组方法,可以正序、反序地查询,并返回数组中满足回调函数的第一个元素的索引,否则返回 -1。// 用法arrayObj.findIndex(callbackfn [, thisArg]);// 回调函数用法function callbackfn(value...原创 2018-07-10 00:25:54 · 11056 阅读 · 0 评论 -
垂直居中:两方向,四方法,条条大路通罗马
垂直居中常见的四种方法总结两条路,即 flex box 或者 绝对定位。四种方法,分别如下:方法一: flex box#container{ display: flex; justify-content: center; align-items: center;}方法二:绝对定位2.1 先把顶点移动到中心,再挪回自身长宽的一半(transform-translate)...原创 2019-03-07 19:26:06 · 286 阅读 · 0 评论 -
经典闭包题目ES7新解
题目for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(new Date, i) }, 1000)}console.log(new Date, i)输出:5 (1s)5 5 5 5 5如何变成: 5(1s)0(1s)1(1s)2(1s)3(1s)4经典解法闭包fo...原创 2019-05-02 05:43:31 · 258 阅读 · 0 评论 -
JavaScript 实现 map() 方法函数
思路map 迭代方法接收两个参数:对每一项执行的函数 该函数接收三个参数: 数组项的值数组项的下标数组对象本身指定 this 的作用域对象map 方法返回每次函数调用结果组成的数组。代码表示:arr.map(function(item, index, arr) {}, this);实现由此,实现 fakeMap 方法如下代码:Array...原创 2018-05-03 13:57:52 · 12301 阅读 · 0 评论 -
用 JavaScript 函数实现时间格式转换('46秒' => '00:00:46')
题目假设传入的参数就是“2时5分”、“3时46秒”这种格式的字符串,省去参数类型检测。 略去检测分秒数大于 60 的情况。思路:先把字符串 split 打散转换为数组forEach() 遍历数组元素找出“时”、“分”等关键词的 index据此切分拼接新格式数组注意点:arguments 和对应参数的绑定 非严格模式下,当传入实参,实参和 arguments ...原创 2018-05-03 02:13:56 · 751 阅读 · 0 评论 -
JavaScript 函数节流(throttle)的实现
函数节流是什么对于持续触发的事件,规定一个间隔时间(n秒),每隔一段只能执行一次。上一篇讲的函数防抖(debounce)与本篇说的函数节流(throttle)相似又不同。函数防抖一般是指对于在事件被触发n秒后再执行的回调,如果在这n秒内又重新被触发,则重新开始计时。二者都能防止函数过于频繁的调用。区别在于,当事件持续被触发,如果触发时间间隔短于规定的等待时间(n秒),那么...原创 2018-04-06 20:27:32 · 13058 阅读 · 0 评论 -
一道 promise 亮灯问题的 思路演进 与 深坑 (JS异步机制) 分析
问题红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯按照这个规律不断交替重复亮灯?(用Promse实现)三个亮灯函数已经存在:function green() { console.log("green");}function yellow() { console.log("yellow");}function red() { console.log(...原创 2018-03-17 23:42:24 · 1350 阅读 · 0 评论 -
JavaScript call() 与 apply() 方法的实现与思路解析
用一个例子开始greet = "Hi, Im global";let foo = { greet: "Hello"};let bar = function(name, character) { console.log(this.greet); return { greet: this.greet, person: `${name} is ${char...原创 2018-03-30 17:15:23 · 369 阅读 · 0 评论 -
JavaScript bind() 方法的实现
bind() 方法的特点bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,可以把除了第一个参数以外的其他参数都传递给下层的函数(这种技术称为“部分应用”,是“柯里化”的一种)注①如果 bind() 返回的函数 作为构造函数使用,bind 时指定的 this 值会失效,但传入的参数有效。 new 调用返回的实例能够继承 绑定...原创 2018-03-31 11:00:02 · 1435 阅读 · 0 评论 -
JavaScript new 的实现
new 特性《你不知道的JavaScript》提到:使用 new 调用函数,或者说发生构造函数调用时,会自动执行下面的操作:创建(或者说)构造一个全新的对象;这个新对象会被执行 [[Prototype]] 连接;这个新对象会绑定到函数调用的 this;如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象。new 的实现用法: fakeNe...原创 2018-03-31 14:49:10 · 575 阅读 · 0 评论 -
JS 显示原型、隐式原型与原型链 / 构造函数、实例、实例原型之间的关系
什么是原型链原型链是利用原型,让一个引用类型继承另一个 引用类型的属性和方法。为了说明白原型链,需要从构造函数、原型与实例的关系讲起。构造函数、原型与实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针(显式原型),而实例都包含一个指向原型对象的内部指针(隐式原型)。那么,假如让原型对象等于另一个类型的实例,结果会让此事的原型对象包含一个指...原创 2018-03-31 16:06:49 · 1836 阅读 · 0 评论 -
JavaScript 实现继承的方式:原型链、组合式、寄生组合式
原型链继承let Parent = function() { this.name = [‘parent']}Parent.prototype.sayName = function() { console.log(this.name)}let Child = function(){}Child.prototype = new Parent() //原型式继承l...原创 2018-04-14 19:10:44 · 430 阅读 · 0 评论 -
JavaScript 函数防抖(debounce)的实现
函数防抖是什么函数防抖是指对于在事件被触发n秒后再执行的回调,如果在这n秒内又重新被触发,则重新开始计时,是常见的优化,适用于 表单组件输入内容验证防止多次点击导致表单多次提交等情况,防止函数过于频繁的不必要的调用。代码实现思路用 setTimeout 实现计时,配合 clearTimeout 实现“重新开始计时”。即只要触发,就会清除上一个计时器,又注册...原创 2018-04-06 12:53:52 · 18781 阅读 · 0 评论 -
用 reduce 实现一行代码深拷贝对象/数组
一行实现深拷贝数组const deepCopyArr = arr => arr.reduce((acc, cur) => ( cur instanceof Array ? [...acc, deepCopyArr(cur)] : [...acc, cur]), [])一行实现深拷贝对象const deepCopyObj = obj => Object.entries...原创 2019-05-23 05:47:21 · 1237 阅读 · 0 评论