前端面试知识整理,每日一题

139 阅读6分钟

每日一题

2022.1.12

1.定位中,absolute 与 fixed 共同点与不同点

  • 相同点:改变行内元素的呈现方式,display被设置为inline—block. 元素脱离文档流,触发BFC
  • 不同点:相对定位的元素不同,absolute是相对于离他最近的有定位的元素进行定位(一般使用“子绝父相”的方式),如果没有定位的父元素则相对于浏览器窗口. fixed是相对于浏览器窗口定位。在有滚动条的页面中,absolute会跟随页面滑动,fixed不会滑动,始终固定在同一位置

2.闭包的概念及特点

  • 闭包就是可以访问其他函数内部变量的函数,利用闭包可以突破作用域链。
  • 函数嵌套函数,内部函数引用外部函数的数据,并且外部函数执行就会产生闭包。使用闭包一般是为了设计私有的方法和属性,闭包可以避免全局变量的污染,缺点是闭包会常驻内存,增加内存使用量,使用不当容易造成内存泄漏。

3.力扣101.对称二叉树:给你一个二叉树的根节点root,检查它是否轴对称

leetcode-cn.com/problems/sy…

var isSymmetric = function(root) {
    //使用递归遍历左右子树 递归三部曲
    // 1. 确定递归的参数 root.left root.right和返回值true false 
    const compareNode=function(left,right){
        //2. 确定终止条件 空的情况
        if(left===null&&right!==null||left!==null&&right===null){
            return false;
        }else if(left===null&&right===null){
            return true;
        }else if(left.val!==right.val){
            return false;
        }
        //3. 确定单层递归逻辑
        let outSide=compareNode(left.left,right.right);
        let inSide=compareNode(left.right,right.left);
        return outSide&&inSide;
    }
    if(root===null){
        return true;
    }
    return compareNode(root.left,root.right);
};

2022.1.13

1.箭头函数与普通函数的区别

  • 箭头函数相比于普通函数更加简洁
  • 箭头函数没有this不会改变this的指向
  • 箭头函数没有prototype,agruements
  • 箭头函数没有原型故不能作为构造函数
  • 箭头函数不能作Generator函数,不能使用yeild关键字

2.this 指向哪里?

  • 箭头函数没有this,this的指向取决于箭头函数外部的执行上下文
  • 普通函数,this的指向取决于该函数运行时的执行上下文环境 - https://mp.weixin.qq.com/s/hYm0JgBI25grNG_2sCRlTA
  • 详细this问题见上面链接,转自王红元老师

3.扩展运算符的作用及适用场景

扩展运算符(...)
将一个数组转为用逗号分隔的参数序列。

console.log(...[1,2,3]) //1,2,3
该运算符主要用于函数调用,可以将一个数组变为参数序列,后面还可以放置表达式
扩展运算符的应用
合并数组,与解构赋值结合

var arr1 = ['a','b'];
var arr2 = ['c'];  
var arr3 = ['d','e'];
[...arr1,...arr2,...arr3]  
//['a','b','c','d','e']

扩展运算符还可以将字符串转为真正的数组

[...'hello']
//['h','e','l','l','o']

2022.1.14

1.强缓存和协商缓存的区别

缓存的目的是使页面加载更快,缓存的是静态资源,如js,css,img等
强缓存和协商缓存如果命中缓存,服务器都不会返回资源,区别是强缓存不会发送请求到服务器,协商缓存会发送请求到服务器,强缓存返回的状态码200,协商缓存状态码304

2.如何解决跨域问题

  • 1.jsonp
  • 2.postMessage
  • 3 .websocket
  • 4cors 支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案,使用cors解决跨域问题,会在发送请求时出现两种情况,简单请求和复杂请求。

3.事件委托的理解及使用场景

  • 事件委托,又称事件代理,就是把原本需要绑定的事件委托给父元素,让父元素负责事件监听,利用的原理是DOM元素的事件冒泡,可以提高性能,大量节省内存占用,减少事件注册
  • 使用场景:很多商品放在一个ul下面的li标签里面,点击添加或删除商品,就可以绑定商品的父元素ul标签,通过事件代理去找到要点击的商品,完成添加删除事件

2022.1.17

1.解释一下JavaScript的同源策略

  • 同源是指,协议 域名 端口 三者相同,有任意一个不相同时,都不算同源
  • 在跨域问题上,仅仅是通过URL的首部来识别而不会根据域名对应的IP地址是否相同来判断,所以及使IP地址相同,协议,域名,端口不同,也不能算同源

2.如何实现异步编程

  • 通过回调函数
  • promise
  • 事件监听
  • 采用发布订阅方式
  • async await

3.事件模型的三个阶段

  • 捕获阶段 目标阶段 冒泡阶段
  • 捕获阶段(父级元素先触发,子级元素后触发)
  • 冒泡阶段(子级元素先触发,父级元素后触发)

4 手写快速排序

快速排序1
function quickSort(arr){
  if(arr.length<2) return arr
  const mid = arr[0]
  const l = arr.filter((item,index) => item <=mid && index !==0)
  const r = arr.filter((item) => item >mid)
  return [...quickSort(l),mid,...quickSort(r)]
}
quickSort(arr)
快速排序2
arr = [1,23,4,3,5,4,5,6]
function qSort(arr){
  if(arr.length < 2) {return arr}
  const left = []
  const right = []
  const mid = arr[0]
  for(let i=1;i<arr.length;i++){
    if(arr[i]<mid){
      left.push(arr[i])
    }else{
      right.push(arr[i])
    }
  }
  return [...qSort(left),mid,...qSort(right)]
}
快速排序3
var sortArray = function(nums) {
    if (nums.length < 2) return nums;
    return  quickSort(nums, 0, nums.length - 1);
};

function quickSort(nums, left, right) {
    if (left >= right) return;
    let pivotIndex = partition(nums, left, right)
    quickSort(nums, left, pivotIndex - 1)
    quickSort(nums, pivotIndex + 1, right)
    return nums;
}

function partition (nums, left, right) {
    let pivot = right;
    let leftIndex = left;
    for (let i = left; i < right; i++) {
        if (nums[i] < nums[pivot]) {
            [nums[leftIndex], nums[i]] = [nums[i], nums[leftIndex]];
            leftIndex++;
        }
    }
    [nums[leftIndex], nums[pivot]] = [nums[pivot], nums[leftIndex]];
    return leftIndex;
}

2022.1.18

1. cookie sessionstorage localstorage 的区别

  • 共同点:都是保存在浏览器端,并且是同源的,都是字符串类型的键值对
  • cookie数据始终在同源的http请求中携带,每次http请求都会携带cookie,cookie的数据大小不能超过4KB sessionstorage和localstorage可以达到5MB
  • sessionstorage:仅在浏览器窗口关闭前有效,不能长久保存
  • localstorage:数据始终有效,窗口或浏览器关闭也一直存在

2.浏览器的渲染过程

  • 解析HTML构建DOM树,并行请求CSS,JS,img
  • CSS文件下载完成 开始构建CSSOM树
  • CSSOM树构建完成和DOM树一起生成Render tree
  • 计算每个节点在屏幕中的位置,调用GPU绘制合成图层,显示在屏幕上

3.渐进增强和优雅降级

渐进增强:是针对低版本浏览器构建页面,保证最基本的功能,然后针对高版本浏览器进行效果,交互等改进并追加功能,达到更好的用户体验
优雅降级:一开始就构建完整功能,然后对低版本浏览器进行兼容适配

4 手写斐波那契数列

fib = function(n) {
    let dp = [0, 1]
    for(let i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2]
    }
    console.log(dp)
    return dp[n]
};

2022.1.19

1.字面量new出来的对象和Object.create(null)创建出来的对象有什么区别?

cdea4e970704ae45bb458f7929ace30.png

2. 数据类型检测的方式都有哪些?

8a6f30f052a9d7f11713692924b527c.png

3. new的具体操作过程

494817e145a1156ed50ec11fa7e7954.png