当前位置: 首页 > news >正文

前端奇怪面试题总结

面试题总结
  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]))

答案
apply 调用方式就是 函数.apply(参数1,[3,15])
所以转换后就是 (a => a).apply(3,15)
15

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

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

  1. 惰性函数

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

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

在这里插入图片描述

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

  let flag = falsefunction 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 = nullreturn 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'));
http://www.lryc.cn/news/344353.html

相关文章:

  • NPM--最新淘宝镜像源地址
  • vue3中实现地区下拉选择组件封装
  • 责任链模式案例
  • Android NDK开发(二)——JNIEnv、jobject与jclass关系
  • 机器学习入门:sklearn基础教程
  • 26 | 备库为什么会延迟好几个小时?
  • linux 如何解压.tar 文件
  • 盘点企业信息防泄密软件对比|揭秘企业信息防泄密软件好用榜
  • html--瀑布效果
  • vue视图不刷新强制更新数据this.$forceUpdate()
  • 2024年电工杯数学建模竞赛A题B题思路代码分享
  • leetcode 797.所有可能的路径
  • NPM 基础
  • WPF之创建无外观控件
  • MySQL利用变量进行查询操作
  • 算法--动态规划
  • Python基础详解一
  • 3.SpringSecurity基本原理
  • Cesium--加载天地图
  • 2024蓝桥杯CTF writeUP--packet
  • C++容器——deque
  • docker-compose安装es+kibana 8.12.2
  • websevere服务器从零搭建到上线(二)|Linux上的五种IO模型
  • STM32外设编程指南:GPIO、UART、SPI和I2C
  • git对远程和本地分支进行重命名
  • if 语句逻辑判断顺序
  • 第IV章-Ⅱ Vue3中的插槽使用
  • 【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全
  • E2PROM读写函数
  • MySql中什么是回表? 如何减少回表的次数