使用TypeScript校验运行时数据

2021-09-08
阅读 3 分钟
6.3k
背景对于前端程序猿,常见的开发流程是:前后端约定接口后端给出接口文档根据接口编写 TypeScript 类型定义开发完成进行联调虽然一切顺利,但是上线后还是翻车了,js 报错:cannot read the property 'xx' of null,很显然前端没有处理空值,接锅吧 TT。但回头一看接口文档,跟后端同学约定的返回对象,但实际返了 null...

求数组中所有数字可拼出的最大整数

2021-09-05
阅读 2 分钟
2.4k
这个题目实际上是对数组进行排序,排序的规则是让最大的数字排在高位,比如:70和41比较,7大于4,所以70应该放在41前;但是有特殊情况,如果两个数字前几位都相同该怎么办,比如539和53,5和3都相同,此时应该用539中的9和53的第一位5比较,9大于5,所以539应该放在前面。

Promise并发控制

2021-08-25
阅读 2 分钟
11.7k
但是有个问题是,因为 promise 创建后会立即执行,也就是说传入到 promise.all 中的多个 promise 实例,在其创建的时候就已经开始执行了,如果这些实例中执行的异步操作都是 http 请求,那么就会在瞬间发出 n 个 http 请求,这样显然是不合理的;更合理的方式是:对 Promise.all 中异步操作的执行数量加以限制,同一时间...

闭包理解

2018-08-22
阅读 3 分钟
4.2k
红宝书上给出的定义是:闭包是指有权访问另一个函数作用域中的变量的函数,看到另外一个理解是:函数和函数内部能访问到的变量(或者环境)的总合,就是一个闭包。创建一个闭包最常见的方式就是在一个函数内部创建另一个函数。下面写一个例子:

关于NaN

2018-08-21
阅读 2 分钟
7k
昨天看到一个面试题:怎样实现 isNaN() 方法? 细细研究了一下 NaN,发现这个东西不常用,坑却异常多,颇有 “茴” 字有几种写法的感觉,这里记录下总结的东西吧。 NaN 是什么 NaN 即 Not a Number(非数值),但它是一个特殊的数值,所以: {代码...} 编码时很少直接使用 NaN,通常是在计算失败时,作为 Math 的某个方法的...

数组去重-Map实现

2018-08-07
阅读 3 分钟
19k
最简单的想法就是两层 for 循环遍历数组,这样的时间复杂度是 O(n^2)。而更高效的方式,是使用hash Map,可将时间复杂降为O(n)。

JS面向对象编程之封装

2018-08-01
阅读 4 分钟
11.1k
我们所熟知的面向对象语言如 C++、Java 都有类的的概念,类是实例的类型模板,比如Student表示学生这种类型,而不表示任何具体的某个学生,而实例就是根据这个类型创建的一个具体的对象,比如zhangsan、lisi,由类生成对象体现了抽象模板到具体化的过程,这叫做基于类的面向对象方式,而 JavaScript 没有类的概念,是基...

Event Loop

2018-07-31
阅读 4 分钟
3.1k
本文主要参阅了以下两篇文章,对JS的Event Loop运行机制基础知识进行了整理。从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理JavaScript 运行机制详解:再谈Event Loop背景知识进程与线程大家都知道JavaScript是单线程的,这就引申出一个问题,进程与线程是什么,他们的区别是什么?先给出进程和线程的定义:进程...

Ajax基础知识梳理

2018-07-17
阅读 4 分钟
6.9k
Ajax用一句话来说就是无须刷新页面即可从服务器取得数据。注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件。

JS中的一些坑(持续更新)

2018-07-05
阅读 1 分钟
1.9k
觉得 forEach 方法中的 item 参数是按值传递,所以不会改变原来的 arr,答案为:[{a:1},{}] 。正确答案是:[{a:1, b:0},{b:1}] 。这里忽略了一个重要的点,即函数参数虽然是按值传递,不是按引用传递,但是基本类型和引用类型本身的差别被忽略了。

从斐波那契数列看递归和动态规划

2018-07-05
阅读 3 分钟
8.6k
大名鼎鼎的斐波那契数列:0,1,1,2,3,5,8,13,21...使用数学归纳法可以看出其规律为:f(n) = f(n-1) + f(n-2)。

JS实现希尔排序

2018-07-05
阅读 2 分钟
2.7k
希尔排序是按一定的间隔对数列进行分组,然后在每一个分组中做插入排序;随后逐次缩小间隔,在每一个分组中做插入排序...直到间隔等于1,做一次插入排序后结束。

JS实现插入排序

2018-07-05
阅读 2 分钟
12.3k
直接插入排序的时间复杂度为 O(n^2) ,相较于复杂度为 O(nlogn) 的快速排序、归并排序、堆排序、希尔排序,插入排序可谓相形见绌。但是,插入排序真的一无是处吗? 答案是否定的,插入排序在实践中的使用频率是很高的,在一些场景下,甚至展现出完胜高级排序的效率。下面我们一起来看看。

JS实现归并排序

2018-07-05
阅读 2 分钟
14.2k
一直对递归理解不深,原因是递归的过程很抽象,分析不清内存堆栈的返回过程。偶然google到一篇博文递归(不得不说,技术问题还是要多google),对递归过程的内存堆栈分析豁然开朗,下面先列出分析过程:

JS实现快速排序

2018-07-05
阅读 3 分钟
16.2k
看了一篇通俗易懂的快排文章 快排,下面一步一步 实现整个过程。快排的基本思想上面链接的文章对快排的思路提出了一个很形象的概念:挖坑填数 + 分治法,分三个步骤实现:从数组中取出一个数作为基准(pivot)。在原数组中进行移动,将大于基准的数放到基准右边,小于基准的数放到基准左边,在基准左右形成两个子数组。在...

理解async/await

2018-07-05
阅读 6 分钟
27k
JavaScript 是单线程的,在发出一个调用时,在没有得到结果之前,该调用就不返回,意思就是调用者主动等待调用结果,换句话说,就是必须等待上一个任务执行完才能执行下一个任务,这种执行模式叫:同步。Node.js 的主要应用场景是处理高并发(单位时间内极大的访问量)和 I/O 密集场景(ps: I/O 操作往往非常耗时,所以...

JS实现堆排序

2018-07-05
阅读 4 分钟
20.5k
堆的预备知识 堆是一个完全二叉树。 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点)。 大顶堆:根结点为最大值,每个结点的值大于或等于其孩子结点的值。 小顶堆:根结点为最小值,每个结点的值小于或等于其孩子结点的值。 堆...

如何理解 (object.getName = object.getName)() 这段代码?

2018-07-05
阅读 2 分钟
2.8k
上面这行代码的含义就是:将等号左边 object 对象的 getName 方法赋值为 object.getName。(刚看这段代码时犯了一个错误,即getName 方法后面是没有加括号的,也即是函数不执行,仅仅是传递了它的引用。)