JavaScript每日五题面试题(第八天)

1、说一下this关键字的指向

  1. 默认情况下,当在全局作用域下使用this关键字时,它指向window对象。
  2. 当在对象的方法中使用this关键字时,它指向调用该方法的对象。
  3. 当使用构造函数创建新对象时,this关键字指向正在创建的新对象。
  4. 在事件处理程序中,this关键字通常指向触发事件的元素。
  5. 当使用call()或apply()方法调用函数时,可以显式地指定this关键字的值。
  6. 在箭头函数中,this关键字的指向与外层函数的this关键字的指向相同。

2、判断数组的方法以及优缺点?

  1. 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)

  2. instanceof 关键字:该关键字用于判断一个对象是否是某个类的实例,对于数组来说,判断表达式为 arr instanceof Arrayarr instanceof Object

    • let arr = [1, 2, 3];
      console.log(arr instanceof Array); // true
      console.log(arr instanceof Object); // true
      
      
    • 优点:可用于跨窗口和跨文档通信。

      缺点:无法准确区分数组和其他对象,例如 Array 的子类和其他类的实例。

  3. 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) 是把接收多个参数的原函数变换成接受一个单一参数(原来函数的第一个参数的函数)并返回一个新的函数,新的函数能够接受余下的参数,并返回和原函数相同的结果。

  1. 参数对复用
  2. 提高实用性
  3. 延迟执行 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。柯里化的函数可以延迟接收参数,就是比如一个函数需要接收的参数是两个,执行的时候必须接收两个参数,否则没法执行。但是柯里化后的函数,可以先接收一个参数

4、setInterval时间为什么不准确?怎么解决?

setInterval() 是 JavaScript 中的一个函数,用于在指定的时间间隔内重复执行指定的代码。但是,setInterval() 执行的时间间隔并不是精确的,而是在指定的时间间隔后尽快执行代码。这是由于 JavaScript 是单线程执行的,而且它的事件循环机制会在调用栈为空时执行下一次事件。如果前一个代码执行时间过长或当前调用栈中有其他代码需要执行,setInterval() 执行的时间间隔就会受到影响。

为了解决 setInterval() 不准确的问题,有以下几种方法:

  1. 使用 setTimeout():可以使用 setTimeout() 函数递归调用自身来模拟 setInterval() 的效果。在每次递归调用时计算下一次调用的时间,以实现更准确的时间间隔。
  2. 使用 requestAnimationFrame():与 setTimeout() 类似,requestAnimationFrame() 可以实现更准确的时间间隔。但是,requestAnimationFrame() 的执行时间是以屏幕刷新率为基准的,通常为每秒 60 次左右,因此可能不适合所有情况。
  3. 使用 Web Worker:Web Worker 可以在后台运行一个独立的线程,以避免主线程的繁忙影响 setInterval() 的准确性。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值