判断对象全等
JavaScript 自带了==和===两种判断方式,前者会隐式转换类型导致代码出现问题,而后者则是根据指针地址进行判断。
在绝大多数情况这两种已经足够使用了,不过延伸下想判断两个对象或数组元素是否相同,则会显得不太友好,而且在 JavaScript 中有一些特殊的规则:NaN和NaN不相同、...
函数记忆
记忆化(英语:memoization)是一种提高计算机程序执行速度的优化技术。通过储存大计算量函数的返回值,当这个结果再次被需要时将其从缓存提取,而不用再次计算来节省计算时间。
记忆化是一种典型的在计算时间与电脑存储器空间之中获取平衡的方案。
来源:维基百科
从上面的定义可以看出缓存是一种非...
通用迭代器实现
迭代器在很多语言都很常见,js 的 forEach 就是一个迭代器,下面就来介绍实现一个支持数组、对象、类数组的的 each 函数。
前言
写之前先整理一下思路
我们首先需要判断是不是类数组,如果是数组和类数组就使用 for 循环,如果是对象我们就用 for...in 循环。
回调函数的 ...
相等运算符比较
看《你所不知道的JavaScript》一书,发现对相等运算符的描述推翻了许多人的固有影响,如果熟悉其机制,可以方便我们快速开发
function foo(s) {
s = s == null ? true: s;
// ...
};
上面这段代码我们估计经常使用,其实就是使用了隐式...
函数防抖
前言
为什么需要使用防抖函数
当一个事件触发太多的时候会出现性能问题,比如mousemove、resize、scroll等,看一个没有任何防抖的mousemove事件
什么是防抖?
简单就是你任意触发我只执行最后一次操作
根据上面的定义可以很轻松编写出一个简单的防抖函数
实现
// ...
函数节流
本来打算从零写一个,不过意外看到一篇好文,下面就根据他的思路来实现一个节流,JavaScript专题之跟着 underscore 学节流
前言
节流有两种实现,第一种使用定时器,另外一种则是根据时间戳,判断两次执行的时间间隔,下面简单些一下这两种的实现。
定时器
function thr...
理解原型和原型链
参考: 深入理解javascript原型和闭包(完结)
JavaScript是弱类型,除了基本类型都可以理解为对象,这也是为什么说JavaScript中一切皆对象的原因。
不过在对象中函数比较特殊,对象就是由函数创造出来的,这听起来是不是有点先有鸡后有蛋,先有蛋后有鸡的感觉,这也跟后面要说到...
模拟实现call和apply
call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数
上面是 call 的定义,apply 与 call 类似只是第二个参数是一个数组而 call 接收的则是一个参数列表。
看一个例子
var obj = {
name: "obj"
};
functio...
模拟实现bind
之前说了模拟实现 call 和 apply,下面就来实现 bind,首先先看一下定义 bind 定义
bind()方法创建一个新的函数,在 bind()被调用时,这个新函数的 this 被 bind 的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。
第一版
根据定义我们尝试写一...
变量提升
这里只是用伪代码的形式来说明,实际上变量声明只是执行上下文有关,推荐阅读
JavaScript深入之变量对象
太长不看篇
函数参数 > 函数声明 > 变量声明
变量声明
首先想用一个伪生命周期来说这个事情,假设这段代码分为两个阶段,初始化阶段和赋值阶段; 看下面一段代码,用伪系统的话来阐述
...