返回

编程必备:揭秘2021年大厂面试必考JS基础题(上)

前端

作为一名合格的程序员,扎实的JavaScript基础知识是必备技能之一。在2021年的各大厂面试中,JS基础题仍然占据着相当大的比重。为了帮助大家更好地备战面试,我们整理了以下几个经典问题,并进行了详细的解析。

1. ['1', '2', '3'].map(parseInt) what & why ?

console.log(['1', '2', '3'].map(parseInt));
// 输出:[1, NaN, NaN]

这个问题考察的是JavaScript中的数据类型转换和map()方法的使用。

parseInt()函数可以将字符串转换为整数。但是,如果字符串中包含非数字字符,则转换失败,并返回NaN。

map()方法可以对数组中的每个元素执行指定的函数,并返回一个新的数组。

因此,上面的代码会将数组中的每个字符串转换为整数,并返回一个新的数组。由于'2'和'3'都是有效的整数,因此它们被成功转换。但是,'1'前面有一个单引号,因此parseInt()函数无法将其转换为整数,并返回NaN。

2. typeof null是什么?为什么?

console.log(typeof null);
// 输出:"object"

这个问题考察的是JavaScript中的数据类型。

在JavaScript中,null是一个特殊的值,表示不存在的值。typeof运算符可以返回一个值的类型。

但是,null是一个例外。typeof null返回"object",而不是"null"。

这是因为在JavaScript的早期版本中,null被认为是一个对象。虽然在 późniejsze版本中,null被重新定义为一个基本类型,但typeof null仍然返回"object",以保持向后兼容性。

3. 实现函数防抖(防抖动)

function debounce(fn, delay) {
  let timer = null;
  return function () {
    let context = this;
    let args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(context, args);
      timer = null;
    }, delay);
  };
}

这个问题考察的是JavaScript中的函数防抖技术。

函数防抖是一种优化技术,可以防止函数被频繁调用。它可以有效地提高程序的性能,并防止不必要的函数调用。

debounce()函数接受两个参数:fn和delay。fn是需要被防抖的函数,delay是防抖的延迟时间。

debounce()函数返回一个新的函数,该函数会在被调用后延迟delay毫秒执行fn函数。如果在delay毫秒内函数被再次调用,则会清除之前的延迟调用,并重新开始计时。

这可以有效地防止函数被频繁调用,并提高程序的性能。

4. 实现函数节流(限流)

function throttle(fn, delay) {
  let lastTime = 0;
  return function () {
    let context = this;
    let args = arguments;
    let now = Date.now();
    if (now - lastTime >= delay) {
      fn.apply(context, args);
      lastTime = now;
    }
  };
}

这个问题考察的是JavaScript中的函数节流技术。

函数节流也是一种优化技术,可以防止函数被频繁调用。它可以有效地控制函数的调用频率,并防止不必要的函数调用。

throttle()函数接受两个参数:fn和delay。fn是需要被节流的函数,delay是节流的延迟时间。

throttle()函数返回一个新的函数,该函数会在被调用后延迟delay毫秒执行fn函数。如果在delay毫秒内函数被再次调用,则会被忽略。

这可以有效地控制函数的调用频率,并防止函数被频繁调用。

5. 实现数组扁平化

function flatten(arr) {
  return arr.reduce((acc, cur) => {
    return acc.concat(Array.isArray(cur) ? flatten(cur) : cur);
  }, []);
}

这个问题考察的是JavaScript中的数组扁平化技术。

数组扁平化是指将多维数组转换为一维数组。它可以有效地简化数组的操作,并提高程序的性能。

flatten()函数接受一个数组作为参数,并返回一个扁平化后的数组。

flatten()函数使用reduce()方法来遍历数组。对于每个元素,如果它是数组,则递归调用flatten()函数将其扁平化。否则,将元素添加到累加器acc中。

最后,返回累加器acc,即扁平化后的数组。