笔试题
JavaScript
Index

如何准确检测一个值是null类型而不是其他类型隐式转换而来?

const getType = (value: any) => {
  const str: string = Object.prototype.toString.call(value)
  const typeStrArray = str.substring(1, str.length - 1).split(' ')
  return typeStrArray[1].toLowerCase()
}

手写防抖节流?

  • 防抖(debounce):每次触发定时器后,取消上一个定时器,然后重新触发定时器。防抖一般用于用户未知行为的优化,比如搜索框输入实时提示。

    function debounce(func, time) {
      let timer;
      return function() {
        const [that, args] = [this, arguments]; // 因为有可能是方法在调用,所以保留指针
        clearTimeout(timer)
        // setTimeout内的函数中的this往往指向全局
        // 因为setTimeout里调用这个回调只是普通调用,那么此时的环境是window
        // 箭头函数会帮你把this绑定到声明时的上下文->debounce的上下文->onInputChange的上下文,就不是很有意义了
        timer = setTimeout(() => {
          func.apply(that, args);
        }, time);
      }
    }
     
    onInputChange = debounce((text) => {
      // 获取实时提示
    }, 1000)
  • 节流(throttle):每次触发定时器后,直到这个定时器结束之前无法再次触发该函数。一般用于可预知的用户行为的优化,比如限制按钮点击的触发频率,防止重复的提交。

function throttle(func, time) {
  let previous = 0;
  return function() {
    const [that, args] = [this, arguments];
    const now = Date.now();
    if (now - previous > time) {
      previous = now;
      func.apply(that, args);
    }
  }
}

手写一个Loader?

// 解析css文件并插入到dom中
module.exports = function (content) {
  let str = `
    var style = document.createElement("style");
    style.innerHTML = ${JSON.stringify(content)};
    document.head.appendChild(style);
  `;
  return str;
};
// test: /\.css$/,
// use: [resolve(__dirname, "../loader/testSytleLoader.js")],

手写一个Plugin插件

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';
class ConsoleLogOnBuildWebpackPlugin {
  constructor(options) {
    console.log("current plugin option is" + JSON.stringify(options))
  }
  apply(compiler) { // apply 方法是一个插件所必须的
    // compiler 继承自 tapable
    // tapable  提供了多种 hooks  https://github.com/webpack/tapable#hook-types
    // run      是 AsyncSeriesHook实例 [tapable提供的多种hooks的一种]
    compiler.hooks.run.tap(pluginName, compilation => {
      console.log('webpack 构建过程开始!');
    });
  }
}
 
module.exports = ConsoleLogOnBuildWebpackPlugin

如何获取时区差值?

首先,我们需要获取本地时区与其他时区之间的时间差值。JavaScript提供了一个Date对象,可以获取本地时间和UTC时间之间的差值。我们可以利用这个差值得到本地时间和其他时区时间之间的差值。

// 获取本地时间与UTC时间之间的差值(单位为分钟)
var offset = new Date().getTimezoneOffset();
 
// 计算将本地时间转换为指定时区所需要加上的分钟数
var timeZoneOffset = offset / 60 + timeZoneDiff; // timeZoneDiff为目标时区与UTC时间之间的差值(单位为小时)

有了时区差值,我们就可以将其他时区的时间转换为本地时间了。

// 获取指定时区的本地时间字符串表示形式
function getLocalTimeInTimeZone(timeZoneDiff) {
  var localTime = new Date().getTime() + timeZoneDiff * 60 * 60 * 1000;
  var localTimeStr = new Date(localTime).toLocaleString();
  return localTimeStr;
}
 
// 转换到目标时区的本地时间
var timeZoneDiff = 8// 假设目标时区为东八区
var localTimeInTimeZone = getLocalTimeInTimeZone(timeZoneDiff);