JavaScrpt
专注JavaScript相关知识
前端Jerry
这个作者很懒,什么都没留下…
展开
-
JS创建函数的方式与区别
● 可以提升,但是和函数式声明区别,就是按照习惯首字母需要大些。● 可以变量提升(优先级高于普通的对象),可以先调用,后声明。● 没有变量提升,必须先声明,才能调用。原创 2023-06-09 09:49:14 · 42 阅读 · 0 评论 -
闭包 && 原型变态真题
根据原型可知,当自身没有没有某个属性/方法时,就会往原型上查找,同时再运用object的get拦截方法,进而从中可找到破解该题的方法。通过以上代码可知,obj是个立即执行函数,内部一个闭包person,该立即执行函数返回了读取person对象的方法。在不修改以下代码的前提下,如何修改person对象。或者,定义对象时候规定对象没有原型。原创 2023-06-07 11:27:16 · 62 阅读 · 0 评论 -
如何判断对象里有某个属性
缺点:可以拿到原型上的属性和方法。缺点:可以拿到原型上的属性和方法。原创 2023-06-06 14:22:16 · 38 阅读 · 0 评论 -
JS如何判断一个对象是空对象({})
已知一个对象(Object),如何判断是一个空对象,即{ }。很多人会想到采用Object.keys(obj).length === 0,或者JSON.stringify(obj) === “{}”,这些都是不严谨的,甚至for-in都是错误的。如果key为symbol的话,object.keys拿到的长度仍旧为0。综上,最靠谱的方案就是Reflect.ownKeys()。如果对象设置不可枚举,那么for-in进而就成了摆设了。见上图,拿到的仍旧为"{}",所以存在漏洞。原创 2023-06-06 13:50:33 · 183 阅读 · 0 评论 -
前端埋点方案
当然,除了以上方案之外,其实,像script、link这种的也可以,但是会导致一个很严重的一个问题,需要挂载到html文档流上,否则就不会进行请求该script或link链接,进而导致上报丢失,同时还有就是需要来回操作dom而影响性能。Navigtor.sendBeacon如果业务不考虑极低版本的浏览器的话,这个很不错的方案,否则的话,可以考虑和gif相结合的形式实现前端埋点方案。因为上报埋点,其实也是一种接口调用,调用指定的URL,传递一些指定的参数。● 当业务线增多时,不同的域名,需要解决跨域的问题。原创 2023-06-05 18:38:15 · 178 阅读 · 0 评论 -
前端如何设置请求缓存
【代码】前端如何设置请求缓存。原创 2023-05-20 17:57:17 · 199 阅读 · 0 评论 -
从10万个数中找10个最大的数
【代码】从10万个数中找10个最大的数。原创 2023-05-16 07:45:23 · 292 阅读 · 0 评论 -
求字符串中连续字符出现最长的字符串及长度
c. 求最大值对应的字符,定义两个变量,一个是临时变量a,每次循环判断是否连续,连续a则进行拼接,否则就a置为当前循环的字符;再定一个临时最大长度字符变量b,每次循环结束之后,将刚才的临时变量a和这个临时最大值b变量取最长长度c,最大长度c即是要求的最大长度对应的字符。b. 求最大值,定义两个变量,一个是临时变量a,每次循环判断是否连续,连续a则+1,否则就a置为1;再定一个临时最大值变量b,每次循环结束之后,将刚才的临时变量a和这个临时最大值b变量取最大值c,最大值c即是要求的最大长度。原创 2023-04-20 10:37:46 · 942 阅读 · 0 评论 -
JS求无重复字符的最长字符
b. 定义四个变量,最大长度a1及对应的数组a2,临时最大长度b1及对应的数组b2,循环字符串,判断每个循环体c是否在临时最长数组b2内,在的话就b1+1,同时将c追加到b2内,否则将b1置为1,b2清空,然后追加c。再将a1和a2取最大值,b1和b2取最大值,即得到了最大长度与之对应的数组。a. 基本操作,判断参数类型以及长度。原创 2023-04-22 22:45:33 · 151 阅读 · 0 评论 -
JS中[] + {} == 0和{} + [] == 0的区别
先说 [] + {},根据之前的数据类型转换文字可知,[]会被转为"",{}会转为{}➡️ [object Object],根据之前文章可知,只要其中一个为字符串,那么就会转为字符串拼接,进而得到的是 [object Object]。再说{} + [],在这里,{}可以大致理解为空代码block,而[]会被转为""➡️0,所以empty+0➡️0,如果避免这个情况,可以将使用()将{}包裹起来,即({}) + [],那么得到的就会等同于[] + {}。原创 2023-04-22 22:45:13 · 148 阅读 · 0 评论 -
手动实现call
指定this到函数并传入给定参数执行函数。如果不传入参数,默认指向为 window。将函数设为对象的属性。原创 2023-04-22 22:42:52 · 47 阅读 · 0 评论 -
JS如何计算两数之和
使用map(当然对象也可,但是性能相比map稍差些),循环nums,将当前循环下标a作为value,将目标值target减去当前循环项得到的值b作为key,储存到map中。问题在于对于b的理解,b其实就是我们要在nums中寻找的值,因为这个差值b加上刚才的循环项c即等于我们的目标值target,一旦找到这个差值,也就是我们要找的这个差值b所在的下标,另外就是当前循环项d。时间复杂度:O(n),空间复杂度:O(n)当然,如果嵌套两层循环也是可以实现这个需求的,但是时间复杂度:O(n²),空间复杂度:O(n)原创 2023-04-20 09:24:22 · 558 阅读 · 0 评论 -
函数柯里化
提取公共柯里化函数,接受至少两个参数,一个是处理函数,其余参数是处理函数所需的参数,以下代码为校验的方法。把一个接受多个参数的函数变为接受一个参数的函数,同时返回剩余参数且返回结果的新函数。实现以下这么sum函数,满足一下需求。原创 2023-04-19 12:31:27 · 37 阅读 · 0 评论 -
理解Map、WeakMap、Set、WeakSet区别
a. 具体用法不同,Map是map.set()、map.get()、map.has()、map.delete(),Object可以直接obj.xx进行设置,in判断是否存在(有bug,可以拿到原型上的)等,Map的key可以重名(后者覆盖前者),Object的Key不可重名。a. 方法不同,Set是set.add(),set.clear(),set.delete(),set.has(),也有size属性等。上图可知,当obj被GC回收后,Map将继续保持引用,但WeakMap却造成了数据丢失。原创 2023-04-18 17:09:36 · 72 阅读 · 0 评论 -
如何实现a == 1 && a == 2 && a == 3成立?
https://www.toutiao.com/article/7220009788208693820/)可知,可以重写toString或valueOf方法,即可实现该面试题。另外,也可以学习Vue的数据双向绑定 原理,也可实现。一、采用valueOf或toString,对象进行比较运算时,优先运行valueOf方法,如果得到的不是原始类型数据,则继续运营toString方法,如果得到的 还不是原始类型数据,则报错。二、采用Object.definePropety,拦截其get方法也可。原创 2023-04-10 13:38:11 · 245 阅读 · 0 评论 -
0.1+0.2 ≠ 0.3
2.45存储为2.4500000…,所以就导致了2.55.toFixed(1)➡️2.5、2.45.toFixed(1)➡️2.5。JS中整数和浮点数统属于数字类型,在计算机中,所有的数字都是采用IEEE754标准的64位双精度浮点数形式存储,进而导致了无论是储存、计算中都会存在精度问题。转为十进制:0 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 * 1/64 …以上是计算时的精度问题,那么接下来看下储存时的精度问题。原创 2023-04-17 15:50:58 · 49 阅读 · 0 评论 -
如何理解JS闭包
从上图中可知,由于func3内,访问了外部作用域的a、c、e变量,进而从左侧debug中可以看出形成了三个闭包,而b、d、f没有访问,进而没有形成闭包。如果人为的创建的闭包,垃圾回收机制不会自动回收,需要人为的进行回收,如:将变量置为null。延长变量声明周期,让局部变量持续保存下来,不随着它的上下文环境一起销毁。像上图1中这种自动形成的闭包,垃圾回收机制会进行回收。只要在执行函数内访问外包作用域,即创建了闭包,如;如何让打印1、2、3、4、5。答案: 6、6、6、6、6。原创 2023-04-16 15:27:42 · 33 阅读 · 0 评论 -
观察者订阅模式
【代码】观察者订阅模式。原创 2023-04-14 15:33:13 · 37 阅读 · 0 评论 -
JS中var、const、let区别
d. 声明的时候必须赋值,且值如果是简单数据类型的话,不可以修改。console.log(‘第’ + (i + 1) + ‘个’)声明变量的时候,如果不采用关键字的话,默认为全局变量。a. 没有块级作用域,仅有全局作用域、函数作用域。a. 没有全局作用域,有块级作用域、函数作用域。a. 没有全局作用域,有块级作用域、函数作用域。d. 声明的时候可以不赋值,且值可以修改。d. 声明的时候可以不赋值,且值可以修改。b. 有暂时性死区,不可重复声明。b. 有暂时性死区,不可重复声明。原创 2023-04-14 09:34:47 · 52 阅读 · 0 评论