1、说一下this关键字的指向
- 默认情况下,当在全局作用域下使用this关键字时,它指向window对象。
- 当在对象的方法中使用this关键字时,它指向调用该方法的对象。
- 当使用构造函数创建新对象时,this关键字指向正在创建的新对象。
- 在事件处理程序中,this关键字通常指向触发事件的元素。
- 当使用call()或apply()方法调用函数时,可以显式地指定this关键字的值。
- 在箭头函数中,this关键字的指向与外层函数的this关键字的指向相同。
2、判断数组的方法以及优缺点?
-
Array.isArray()
方法:该方法是 ES5 新增的数组判断方法,返回一个布尔值,如果传入的参数是数组,则返回true
,否则返回false
。let arr = [1, 2, 3]; console.log(Array.isArray(arr)); // true console.log(Array.isArray({})); // false
优点:代码简单,兼容性好,适用于大多数场景。 缺点:无法跨窗口(frame、iframe)和跨文档通信(postMessage、Web Worker)
-
instanceof
关键字:该关键字用于判断一个对象是否是某个类的实例,对于数组来说,判断表达式为arr instanceof Array
或arr instanceof Object
。let arr = [1, 2, 3]; console.log(arr instanceof Array); // true console.log(arr instanceof Object); // true
优点:可用于跨窗口和跨文档通信。缺点:无法准确区分数组和其他对象,例如
Array
的子类和其他类的实例。 -
Object.prototype.toString.call()
方法:该方法可返回对象的类型字符串,例如"[object Array]"
表示数组类型。使用该方法判断数组类型的代码为:Object.prototype.toString.call(arr) === "[object Array]"
let arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
-
优点:能够准确区分数组和其他对象,兼容性较好。
缺点:代码比较繁琐。
3、什么是函数柯里化?
柯里化(Currying) 是把接收多个参数的原函数变换成接受一个单一参数(原来函数的第一个参数的函数)并返回一个新的函数,新的函数能够接受余下的参数,并返回和原函数相同的结果。
- 参数对复用
- 提高实用性
- 延迟执行 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。柯里化的函数可以延迟接收参数,就是比如一个函数需要接收的参数是两个,执行的时候必须接收两个参数,否则没法执行。但是柯里化后的函数,可以先接收一个参数
4、setInterval时间为什么不准确?怎么解决?
setInterval()
是 JavaScript 中的一个函数,用于在指定的时间间隔内重复执行指定的代码。但是,setInterval()
执行的时间间隔并不是精确的,而是在指定的时间间隔后尽快执行代码。这是由于 JavaScript 是单线程执行的,而且它的事件循环机制会在调用栈为空时执行下一次事件。如果前一个代码执行时间过长或当前调用栈中有其他代码需要执行,setInterval()
执行的时间间隔就会受到影响。
为了解决 setInterval()
不准确的问题,有以下几种方法:
- 使用
setTimeout()
:可以使用setTimeout()
函数递归调用自身来模拟setInterval()
的效果。在每次递归调用时计算下一次调用的时间,以实现更准确的时间间隔。 - 使用
requestAnimationFrame()
:与setTimeout()
类似,requestAnimationFrame()
可以实现更准确的时间间隔。但是,requestAnimationFrame()
的执行时间是以屏幕刷新率为基准的,通常为每秒 60 次左右,因此可能不适合所有情况。 - 使用 Web Worker:Web Worker 可以在后台运行一个独立的线程,以避免主线程的繁忙影响
setInterval()
的准确性。