程序员依扬

Results 84 issues of 程序员依扬

- [引言](#%E5%BC%95%E8%A8%80) - [高阶函数](#%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0) - [函数作为参数传递](#%E5%87%BD%E6%95%B0%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92) - [Array.prototype.map](#arrayprototypemap) - [不使用高阶函数](#%E4%B8%8D%E4%BD%BF%E7%94%A8%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0) - [使用高阶函数](#%E4%BD%BF%E7%94%A8%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0) - [Array.prototype.filter](#arrayprototypefilter) - [不使用高阶函数](#%E4%B8%8D%E4%BD%BF%E7%94%A8%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0-1) - [使用高阶函数](#%E4%BD%BF%E7%94%A8%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0-1) - [Array.prototype.reduce](#arrayprototypereduce) - [不使用高阶函数](#%E4%B8%8D%E4%BD%BF%E7%94%A8%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0-2) - [使用高阶函数](#%E4%BD%BF%E7%94%A8%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0-2) - [无 initialValue 值](#%E6%97%A0-initialvalue-%E5%80%BC) - [有...

进阶系列
高阶函数

## 引言 上篇文章详细介绍了浅拷贝 `Object.assign`,并对其进行了模拟实现,在实现的过程中,介绍了很多基础知识。今天这篇文章我们来看看一道必会面试题,即如何实现一个深拷贝。本文会详细介绍对象、数组、循环引用、引用丢失、Symbol 和递归爆栈等情况下的深拷贝实践,欢迎阅读。 ## 第一步:简单实现 其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,浅拷贝时判断属性值是否是对象,如果是对象就进行递归操作,两个一结合就实现了深拷贝。 根据上篇文章内容,我们可以写出简单浅拷贝代码如下。 ```js // 木易杨 function cloneShallow(source) { var target = {}; for (var key in source) { if...

进阶系列
深浅拷贝原理

大家好,我是依扬,在蚂蚁一直是面试官,负责招聘正式员工和合作伙伴的面试,大家对大厂面试、内推、校招相关的都可以找我哈! 这是面试直播系列文章,每周更新一篇,下一篇将通过案例来演示简历如何写,才能获得面试官的青睐,大家记得关注我,更新后会收到推送! ### 简历如何写 1、简历三大原则:清晰,简短,必要,给面试官留下好印象 2、技术能力匹配:满足招聘方的要求,技术水平要达标 3、突出项目亮点:10 秒以内要让面试官发现亮点,有问下去的动力 #### 1、简历三大原则 一份好简历应该满足以下三个特征:清晰,简短,必要 **1)清晰**:简历是易于理解的,排版简单,不会模棱两可 比如学校和毕业时间,工作多少年,相应行业的工作经验,求职岗位等需要清晰明确。 社招时有的人会把实习时间算上去,这个工作时间就对不上了,社招的话不用写实习相关内容了,除非内容特别好。 还有的人会把毕业学校放到简历最后面,有的毕业时间都没有让面试官来猜,真的是蜜汁操作。这种一般就默认简历不行,求职者自己都不自信,面试官继续看简历的心情是没有的。 **2) 简短**:在工作汇报或者面试跳槽中,「突出重点」是非常重要的能力,有利于让面试官一下就明白你想表达的重点内容。非常重要的部分可以适当加粗,然后简历不要超过 2 页。 这部分不知道怎么做的话,推荐大家看看 《金字塔原理》这本书,非常棒,职场人必备。 **3)必要**:简历上面只需要有必要的信息,能够帮助彼此最大化的节约时间,提升效率。保证简历里面的内容都是面试官感兴趣的。 基本信息包括姓名、邮箱、手机号、工作年限、意向城市等基本信息,像籍贯这些对面试来说不重要的内容就不用写了。 有的人会在简历中放上 GitHub 或者博客链接,如果博客内容充实可以放上去,如果没什么内容,只是几个面经笔记的话,这种链接就不要放了,反而降分。 贴了博客链接的话,面试官一般都会去看一眼的,所以博客内容要准备一下,避免忘记后面试时尴尬。 有的人会把项目经历中相似的项目全部列出来,比如 A 管理后台、B...

面试系列

## 引言 在上一篇文章中介绍了如何实现一个深拷贝,分别说明了对象、数组、循环引用、引用丢失、`Symbol` 和递归爆栈等情况下的深拷贝实践,今天我们来看看 `Lodash` 如何实现上述之外的函数、正则、Date、Buffer、Map、Set、原型链等情况下的深拷贝实践。本篇文章源码基于 `Lodash` 4.17.11 版本。 更多内容请查看 [GitHub](https://github.com/yygmind/blog) ## 整体流程 ### 入口 入口文件是 `cloneDeep.js`,直接调用核心文件 `baseClone.js` 的方法。 ```js // 木易杨 const CLONE_DEEP_FLAG = 1 const CLONE_SYMBOLS_FLAG = 4...

进阶系列
深浅拷贝原理

本期的主题是**调用堆栈**,本计划一共28期,**每期重点攻克一个面试重难点**,如果你还不了解本进阶计划,文末点击查看全部文章。 如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。 --- 上篇文章详细介绍了内存回收和内存泄漏,今天我们继续这个篇幅,不过重点是内存泄漏可能发生的原因。 #### 垃圾回收算法 常用垃圾回收算法叫做**标记清除 (Mark-and-sweep) **,算法由以下几步组成: - 1、垃圾回收器创建了一个“**roots**”列表。roots 通常是代码中全局变量的引用。JavaScript 中,“window” 对象是一个全局变量,被当作 root 。window 对象总是存在,因此垃圾回收器可以检查它和它的所有子对象是否存在(即不是垃圾); - 2、所有的 roots 被检查和标记为激活(即不是垃圾)。所有的子对象也被递归地检查。从 root 开始的所有对象如果是可达的,它就不被当作垃圾。 - 3、所有未被标记的内存会被当做垃圾,收集器现在可以释放内存,归还给操作系统了。 现代的垃圾回收器改良了算法,但是本质是相同的:可达内存被标记,其余的被当作垃圾回收。 #### 四种常见的JS内存泄漏 **划重点** 这是个考点...

进阶系列
调用堆栈

## 引言 上一节我们认识了节流函数 throttle,了解了它的定义、实现原理以及在 underscore 中的实现。这一小节会继续之前的篇幅聊聊防抖函数 debounce,结构是一样的,将分别介绍定义、实现原理并给出了 2 种实现代码并在最后介绍在 underscore 中的实现,欢迎大家拍砖。 有什么想法或者意见都可以在评论区留言,下图是本文的思维导图,高清思维导图和更多文章请看我的 [Github](https://github.com/yygmind/blog)。 ![111](https://ws1.sinaimg.cn/large/006tNc79ly1g3wexddadij35v80titrh.jpg) ## 定义及解读 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,**都只执行最后一次**。假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。 ![img](https://static.xmt.cn/d3e6c89fb74b492fabc14f6185af77ce.png) 举一个小例子:假定在做公交车时,司机需等待最后一个人进入后再关门,每次新进一个人,司机就会把计时器清零并重新开始计时,重新等待 1...

进阶系列
防抖节流

[TOC] #### 1、原型链继承 构造函数、原型和实例之间的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。 继承的本质就是**复制,即重写原型对象,代之以一个新类型的实例**。 ```js function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = function() { return this.property; } function SubType() { this.subproperty = false; } // 这里是关键,创建SuperType的实例,并将该实例赋值给SubType.prototype SubType.prototype...

继承

## bind() > `bind()` 方法会创建一个新函数,当这个新函数被调用时,它的 `this` 值是传递给 `bind()` 的第一个参数,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。bind返回的绑定函数也能使用 `new` 操作符创建对象:这种行为就像把原函数当成构造器,提供的 `this` 值被忽略,同时调用时的参数被提供给模拟函数。(来自参考1) 语法:`fun.bind(thisArg[, arg1[, arg2[, ...]]])` `bind` 方法与 `call / apply` 最大的不同就是前者返回一个绑定上下文的**函数**,而后两者是**直接执行**了函数。 来个例子说明下 ```js var value = 2; var...

进阶系列
this全面解析

之前文章详细介绍了 this 的使用,不了解的查看【进阶3-1期】。 ## call() 和 apply() > call() 方法调用一个函数, 其具有一个指定的 `this` 值和分别地提供的参数(**参数的列表**)。 `call()` 和 `apply()`的区别在于,`call()`方法接受的是**若干个参数的列表**,而`apply()`方法接受的是**一个包含多个参数的数组** 举个例子: ```js var func = function(arg1, arg2) { ... }; func.call(this, arg1, arg2); //...

进阶系列
this全面解析

## 引言 上篇文章介绍了赋值、浅拷贝和深拷贝,其中介绍了很多赋值和浅拷贝的相关知识以及两者区别,限于篇幅只介绍了一种常用深拷贝方案。 本篇文章会先介绍浅拷贝 `Object.assign` 的实现原理,然后带你手动实现一个浅拷贝,并在文末留下一道面试题,期待你的评论。 ## 浅拷贝 `Object.assign` 上篇文章介绍了其定义和使用,主要是将所有**可枚举属性**的值从一个或多个源对象复制到目标对象,同时返回目标对象。(来自 MDN) 语法如下所示: > `Object.assign(target, ...sources)` 其中 `target` 是目标对象,`sources` 是源对象,可以有多个,返回修改后的目标对象 `target`。 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后来的源对象的属性将类似地覆盖早先的属性。 ### 示例1 我们知道浅拷贝就是拷贝第一层的**基本类型值**,以及第一层的**引用类型地址**。 ```js // 木易杨 // 第一步 let...

进阶系列
深浅拷贝原理