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