前端奇怪面试题总结

面试题总结
  1. 不修改下面的代码进行正常解构

这道题考的是迭代器和生成器的概念

let [a,b] = {a:1,b:2}

答案
对象缺少迭代器,需要手动加上

Object.prototype[Symbol.iterator] = function* (){
 // return Object.values(this)[Symbol.iterator]()
 return yeild* Object.values(this)
}
ler [a,b] = {a:1,b:2}
  1. 这行代码打印出什么?console.log(console.log.apply.call.call.call.apply((a) => a , [3,15]))

答案
console.log是个function所以可以调用apply.call

15

  1. 游离节点造成的内存泄漏问题总结

浏览器对最后一个获取焦点的input框是不会执行内存回收的!这个是个浏览器bug。如果我们最后一个表单节点是个富文本怎么办?
解决办法:就是动态创建一个获取焦点的input框

  1. 惰性函数

惰性函数说简单点就是对一开始只需要判断一次的方法并且里面有很复杂的逻辑进行确认话处理,减少浏览器的执行的时间

  let flag = false
  function getTableList(){
    if(flag){
      getTableList = () => {
        return `我变成了第一个函数${flag}`
      }
      // 第一次调用
      console.log(getTableList())
    }else{
      getTableList = () => {
        return `我变成了第二个函数${flag}`
      }
         // 第一次调用
      console.log(getTableList())
    }
  }
  console.log( getTableList())

在这里插入图片描述

也可以用高阶函数返回一个函数,效果是一样的

  let flag = false
  function getTableList(){
    if(flag){
     return () => {
        return `我变成了第一个函数${flag}`
      }
     
    }else{
      return  () => {
        return `我变成了第二个函数${flag}`
      }
    }
  }
  let getTable = getTableList()
  console.log( getTable())
  1. 写一个防抖函数并大致说出它的原理

防抖函数原理就是利用setTimeOut 实现一个函数多次调用的时候只执行最后一次函数,前面的函数利用clearTimeout(timer)取消执行

  function debounce(fn,duration = 300){
    // 判断传入的是一个函数表达式
    if(typeof fn != 'function'){
      throw new TypeError ('请传入函数')
    }
    //利用闭包的原理实现定时器的清空
    let timer = null
    return function(...args){
      clearTimeout(timer)
     timer = setTimeout(() => {
      fn.apply(this,args)
     },duration)
    }

  }
  1. 输出下面表达式的值

这道题主要考的是类型转换

([][[]]+[])[+!![]]+([]+{})[+!![]+!!{}]

答案:
([][[]]+[]) => ‘undefined’ [+!![]] => 1 结合起来就是 n
([] ={}) => ‘[object Object]’ [+!![] + !!{}] => 2 结合起来就是b

  1. 不适用for循环之类的方法将一个数组求和

这道题主要考的是递归的用法

let arr = [1,2,3,4,5,6,7,8,9,10,11]
  function sum(arr){
    let i = 0;
    let sum = 0;
    function _fun(){
     if(i >= arr.length){
      return
     }
     sum += arr[i]
     i++
     _fun()
    }
    _fun()
    return sum
  }
  console.log(sum(arr))
// 第二种写法
let sum = 0;
function getSum (arr,index = 0){
  if(index >= arr.length){
    return
  }
  sum += arr[index]
  index ++
  getSum(arr,index)
  return sum
}
  1. 写出一下表达式的值
"use strict";
letAPI;
(function (API) {
    API[API["user"] = 0] = "user";
    API[API["getAge"] = 1] = "getAge";
})(API || (API = {}));
console.log(API)  // {0: 'user', 1: 'getAge', user: 0, getAge: 1}

答案:
牢记一点 ‘=’ 右边只是给左边赋值!!!
先执行[] 里面的赋值 API[‘user’] = 0 执行完之后对象变成了 {user:0}; 在执行外面的API[API[‘user’]] 相当与 API[0] = ‘user’,所以会变成{0:‘user’,user:0}

  1. vue中的hooks是什么

通俗的说就是把一类通用的方法或者组件配置、功能封装在一个模块中,方便重复使用,减少主页面的代码冗余。就是之前utils工具函数的细化版
以下是demo

import { ElMessage, ElMessageBox } from 'element-plus';
import { i18n } from '../i18n';

const { t } = i18n.global;

interface MessageImplements {
	info(title: string): void;
	wraning(title: string): void;
	success(title: string): void;
	error(title: string): void;
}

export function useMessage() {
	class MessageClass implements MessageImplements {
		// 普通提示
		info(title: string): void {
			ElMessage.info(title);
		}

		// 警告提示
		wraning(title: string): void {
			ElMessage.warning(title);
		}

		// 成功提示
		success(title: string): void {
			ElMessage.success(title);
		}

		// 错误提示
		error(title: string): void {
			ElMessage.error(title);
		}
	}

	return new MessageClass();
}
//用法
import { useMessage, useMessageBox } from '/@/hooks/message';
// 其中t() 是国际化配置函数
useMessage().success(t('common.delSuccessText'));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九亿少女无法触及的梦ى

您的赞赏,对我来说意义非凡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值