阅读 97

携程面经金九银十助力大厂-🎉🎉🎉

1.react、vue核心区别

react setState jsx
vue 双向绑定 template
复制代码

2.react setState 和vue的set的区别

react 是单项数据流 setState 用来刷新视图
vue set 是驱动修改视图,本身是支持双向绑定,由于array的属性添加修改调用不到,用set方式可以刷新视图,用处都不同
复制代码

3.有一个页面,h5跟小程序都有,如何公用。

用vue的一些框架来进行打包使用,这样就只可以维护一套代码了
复制代码

4.写一个ant的select组件,如何设计

select 这个类,首先分析当前select需要什么,需要多选的功能,单个选中的功能,disabled,清除功能,去分析当前需要
的功能然后去实现
复制代码

5.{} [] ()判断是否结对出现

堆栈解决(先进后出)
复制代码

6.力扣第一题,两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
// 找到当前需要的值,存储当前减去需要的值,然后去匹配,由于是键值对可以直接获取到
var twoSum = function(nums, target) {
    let map = new Map()
    for(let i=0,len=nums.length;i<len;i++){
        if(map.has(nums[i])){
            return [map.get(nums[i]),i]
        }else{
            map.set(target-nums[i],i)
        }
    }
}
复制代码

7.剑指 Offer 48. 最长不含重复字符的子字符串

复制代码

8.实现flat

flat 主要数组进行减少层级
  // 可以输入
  Array.prototype.myFlat = function(num){
    let arr = this
    let fn = function(arr,num){
      if(num===0){
        return arr
      }
      let ar = []
      for(let i=0,len=arr.length;i<len;i++){
        if(Array.isArray(arr[i])){
          ar = ar.concat(arr[i])
        }else{
          ar.push(arr[i])
        }
      }
      return fn(ar,--num)
    }
    return fn(arr,num)
  }
  let arr = [1,2,3,[4,5,[7,8]]]
  console.log(arr.myFlat(2))
  
  // 直接
  Array.prototype.myFlat = function(){
      let arr = this
      return [].concat(...arr.map(v=>Array.isArray(v)?[].concat([].myFlat.call(v)):v))
  }
  let arr = [1,2,3,[4,5,[7,8]]]
  console.log(arr.myFlat())
  
  
复制代码

9.数组去重,分析时间,空间复杂度

let arr = [1,2,3,4,5,6]
### return [...new Set(arr)]

let fn = function(arr){
    let obj = {}
    return arr.filter(item=>{
        if(obj[item]){
            return false
        }else{
            obj[item]=true
            return true
        }
    })
}

fn(arr)
// 时间复杂度 O(n) 只循环了一次
// 空间复杂度 O(1) 只多用了一个obj
复制代码

9.common.js个esmoudle循环引用会怎么样。

解:(通常都加一分)
复制代码

10.深拷贝的对象相互引用怎么处理。

解:(通常都加一分)
复制代码

11.{console.log(a);let a = 1}

报错,let的暂时性死区
复制代码

11.str= ‘sdfsd{{}}123123{}’,判断花括号是否成对出现

堆栈先进后出
复制代码

12.js有哪些作用域

函数作用域
块作用域
全局
复制代码

13:简述fiber算法,requestAnnimationFrame与requesIdecallback优先级。

requestAnnimationFrame 每一帧执行
requesIdecallback 浏览器空闲才执行
复制代码

14.箭头函数为什么不能作为构造函数

1.箭头函数没有argument
2.构造函数没有prototype
3.没有独立的this
复制代码

15:http2.0对比http1.1升级了什么,内部如何实现的

多路由复用,
基于流进行传输,流上带有当前下标,所以可以进行整合,多文件传输
复制代码

16.标记清除实现原理

从堆起始开始遍历,当前内存没有被引用状态直接回收
复制代码

17:var obj = {name:2}使用alert(obj),返回1

var obj = {name:2}
obj.toString = function(){
    return 1
}
|| or
obj.valueOf = function(){
    return 1
}
alert(obj)
复制代码

18.数组跟链表的优缺点,查询跟插入的复杂度。

解:(通常都加一分)
复制代码

19.http缓存机制

强缓存:
    cache-control : max-age: 22222 //缓存时间
        from memory cache // 内存
        from disk cache // 硬盘
协商缓存
        Last-modified // 当前服务器时间
        ETag // 当前服务器的哈希
        
判断过程:先判断当前强缓存时间是否过期,没有过去就去请求本地的内存和硬盘,过期就去协商缓存,
返回if-Modified-Since(Last-modified) 和 if-no-Match(ETag)来判断当前文件是否有更新,
如果没有更新返回304,更新则返回200和当前更新文件
复制代码

20:简述LRU

淘汰掉最久不用的值,比如有4个内存空间依次,a,b,c,d 然后插入e 的时候a是最久没有用的则去除a,然后使用b,
然后加入f,由于刚使用了b则c是最久没有使用的 ,则去除c
复制代码

11.js声明一个变量,最少占用多少字节

不知道,希望有大佬回答一下
复制代码

12.简述webpack内部原理,画出时序图

解:(通常都加一分)
复制代码

23.写过loader或者plugin吗

没有,
复制代码

14:使用promise.all,如果中间有一个失败了,但是还是想要拿到已经成功的值,怎么做。

map方法包裹一些 catch 方法在map 也会是一个 resolved 状态
复制代码

15:async 比generator有哪些好处。

解:(通常都加一分)
复制代码

26.懒加载的原理。

@import
复制代码

17:ISO有哪七层,tcp/ip在哪一层

解:(通常都加一分)
复制代码

18.CORS怎么配置

前端不配置。。。。
复制代码

19.什么时候会发送options请求。

简单请求不发送 options
复杂请求会先请求 options
复杂请求是head在请求时,添加的一些字段,Content-Type,Content-Language等
复制代码

20.一个树结构,求任意两个节点的最近的父节点。

中序遍历获取数路径,公共路径最后一个相同值就是最近当父节点
复制代码