- 博客(15)
- 收藏
- 关注
原创 详解 JS 函数的 call、apply 及 bind 方法
都能够改变目标函数执行时内部 this 的指向;方法的第一个参数用于指定函数执行时内部的 this 值;支持向目标函数传递任意个参数;若不向方法的第一个参数传值或者传递 undefined、null,则在 JavaScript 正常模式下,目标函数内部的 this 指向 window 对象,严格模式下,分别指向 undefined、null。
2021-08-29 19:25:43
333
原创 判断 JavaScript 数据类型的方式
总结:typeof 操作符;instanceof 操作符;Object.prototype.toString.call() 方法。
2021-08-27 15:47:55
138
原创 JavaScript 中 new 操作符的原理
总结:创建一个空对象;空对象的内部属性 __proto__ 赋值为构造函数的 prototype 属性;将构造函数的 this 指向空对象;执行构造函数内部代码;返回该新对象。
2021-07-10 21:33:31
174
原创 关于 JavaScript 中 this 的指向
总结:全局环境 ➡️ window;普通函数 ➡️ window 或 undefined;构造函数 ➡️ 构造出来的实例;箭头函数 ➡️ 定义时外层作用域中的 this;对象的方法 ➡️ 该对象;call()、apply()、bind() ➡️ 第一个参数。
2021-07-09 01:33:33
113
原创 两个有序数组如何合并成一个有序数组
我这里考虑的两个数组均是升序排序,当然降序的两个数组进行合并算法是类似的。下面有两段相似的代码,第一段除了返回合并后的有序数组还将这两个有序数组清空了,该算法的思路是始终比较两个数组的首元素大小,然后将小者 shift 出来 push 到结果数组中去,因为总是会将数组首元素较小的那个移出,故不用改变比较数组的索引值,一直固定为 0 就行了。最后不要忘记将长度值大于 0 的数组中的元素移出放置到结...
2019-03-15 21:48:15
3897
原创 书写一个用于验证邮箱的正则表达式
首来看几个合法邮箱的例子:1234@qq.com(纯数字)wang@126.com(纯字母)wang123@126.com(数字、字母混合)wang123@vip.163.com(多级域名)wang_email@outlook.com(含下划线 _)wang.email@gmail.com(含英语句号 .)根据对以上邮箱的观察,可将邮箱分为两部分(“@”左边和右边部分)来进行分析...
2019-03-12 20:52:13
2471
原创 对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分
问题描述:假设某个数组中只有数字 1 和 2,进行排序,使得数字 1 位于数组前部分,数字 2 位于后部分。这道算法题其实不是很难,使用各种排序算法应该都能解出,但是若要考虑性能问题,那就得选择一种算法复杂度最低的解法。这里我使用双指针的方法来解答该题,时间复杂度为 O(n)。解法步骤(1)设置一个头指针、一个尾指针,头指针首先指向数组的第一个元素(索引为 0),而尾指针则指向数组的最后...
2019-03-11 21:47:21
1631
原创 获取 url 并解析生成包含查询串参数的对象
页面的 URL 地址可以通过 location.url 取得,举个例子,比如 https://www.example.com/path?name1=value1&name2=value2#top这时根据 URL 中的 ?、# 和 & 特征字符,充分利用好 split() 字符串分割方法将整个 URL 逐渐剥离成以查询串参数组成的数组,最后还是使用 split() 方法根据 = 字...
2019-03-09 20:43:05
237
原创 一张图理解 JS 中的原型链
下图表示了构造函数、原型、实例对象之间的关系:上图是根据下面的一些知识点和总结画出来的:(1)所有的函数(不管是构造函数还是普通函数)都默认有一个 prototype 属性,表示该函数的原型对象,且该原型对象都默认有一个 constructor 属性,这个属性指向拥有该原型对象的函数,如下有几个例子:Object === Object.prototype.constructor; // ...
2019-03-08 19:58:44
212
原创 找出数组中第 k 大的数字及其出现次数
这是前端面试过程中遇到的一道算法题,虽说难度不大,但是也有些细节的地方需要仔细考虑。比如说数组 [1, 2, 4, 4, 3, 5],第 2 大的数字是 4,出现了 2 次。下面以这个为例展开算法的讲解。先说说大体的思路,然后再考虑一些细节性的问题。既然涉及到数字大小的问题,那就要对给定数组进行排序,题目要求“第 k 大”的数字,故选择降序的方式更有利于后面的查找;重点来了,需要遍...
2019-03-07 16:04:17
1553
原创 怎么实现深拷贝
注意点进行拷贝操作时,须加以区分引用类型和基本数据类型的值,且拷贝引用类型的值时,不是简简单单的复制其保存在栈中的指针,(即浅拷贝)而是应该复制其存储在堆中的数据。解题思路(1)方法一:分别对数组、对象、基本数据类型值进行判断、考虑,使用递归的方式复制值(2)方法二:利用了 JSON.parse()、JSON.stringify() 这两个方法实现深拷贝代码/* 方...
2019-03-07 16:01:50
1269
原创 实现数组的随机排序(含洗牌算法)
有时,我们需要将一个数组内的元素顺序进行打乱,达到随机排序的目的。首先想到的是 Math.random() 方法结合数组的 sort() 方法。Math.random() 结合 sort() 方法Math.random() 方法用于产生一个介于 0 和 1 之间的随机数(含 0 但不包括 1)。数组的 sort() 方法可以有两种用法:用法一:在不传入可选的函数参数时,将会对数组的每一个元...
2019-03-07 15:59:55
709
原创 使用 JS 获取文件扩展名
给你一个文件名,你能获得它的扩展名吗?这里面主要考察的是对正则表达式的熟悉程度。我们先对文件名做个分析,扩展名是在文件名的最后,且以 . 开头。如此扩展名便有了两个特点,针对第一个特点,我们用 $ 元字符限定扩展名在整个文件名的最后;对于第二个特点,以 \. 表示扩展名的开头,而用 [^\.]+ 匹配扩展名的名字部分。其中因为 . 是元字符,故予以转义;^ 元字符放置于 . 字符之前表示匹配...
2019-03-07 15:57:05
1869
原创 如何实现数组去重?
要将数组中重复的值剔除,常规解法使用 ES5 中数组的一些 API 即可,而更简便的方法可以结合使用 ES6 中的扩展运算符和 Set 数据结构。下面给出 4 种解法:方法一,使用 splice 方法删除重复的元素function normalize (arr) { if (arr && Array.isArray(arr)) { var len = arr....
2019-03-07 15:54:35
2178
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人