2023年金九银十面经,假的今年没有金九银十

日常工作记录---在虚拟机中进行slam建图    今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau 阅读详情

24岁的我选择了裸辞

前言

说实话选择裸辞后很迷茫,但是又不想在原本的公司上班,目前处于昏昏沉沉的状态,工作也是混一天是一天,没有了什么明确的目标,不知道屏幕前的你们有没有这种感觉,目前想着休息一段时间,可是又不敢休息,钱包不允许。

今年的金九银十根本没有,环境确实很差。

公司A

公司A:第一家面试的公司,没过,一家初创公司,没过也是情理之中,毕竟我面试的状态太差了,很多问题都没回答上来,这时候没什么准备,刚开始刷面试题,不过说实话有点打击,作为毕业以后第一次换工作的经历,刚毕业的时候面一个拿一个offer,甚至都怀疑这两年工作是不是白做了,技术一直下坡路。

笔试题目

第一题. [1,3,5,2,19,30,10] 请将数组排序从小到大

[1,3,5,2,19,30,10] .sort((a,b) => a - b)

加分项: 题目之外还可以自己写一些排序例如算法,但是笔者只答了 sort方法排序

什么是防抖和节流? 它们有什么区别 怎么实现

防抖: 延迟一定时间执行某一方法,如果重新触发时间重置

节流: 是规定时间内多次触发方法只执行一次

区别: 一个是立即执行规定时间内不重复执行,一个是规定时间内只执行一次,其实区别可以不用回答,介绍防抖和节流就包含了区别

实现: 因为现场是笔试所以我这里的答案是简易版的防抖和节流

防抖实现:

function debounce(func, time) {
        let timer = null;
        return function (...args) {
            clearInterval(timer);
            timer = setTimeout(() => {
                func.apply(this, args)
            }, time)
        }
}

节流实现:

function throttle(func, time) {
        let timer = null;
        return function (...args) {
            if (timer) return;
            timer = setTimeout(() => {
                func.apply(this, args);
                timer = null;
            }, time)
        }
}

超出文本省略css和js的实现方式, 考虑兼容性

css:这里我只答出这个,如果css实现方式考虑兼容性应该还要加个-webkit 类似开头,但是笔试忘记怎么写了

overflow: hidden;
text-overflow: ellipsis;

Js:js实现文字超出隐藏其实核心逻辑就是循环添加文字添加完之后判断滚动高度(scrollHeight)是否大于可视高度(offsetHeight)如果大于就把后面三个字符替换成...

function textHidden() {
        let box = document.getElementById('box');
        let str = '测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字测试文字';
        for (let i = 0; i < str.length; i++) {
            if (box.offsetHeight < box.scrollHeight) {
                console.log((box.innerHTML).substring(0, i - 3) + '...');
                box.innerHTML = str.substring(0, i - 3) + '...'
            } else {
                box.innerHTML = box.innerHTML + str[i];
            }
        }
}

什么是柯里化函数,你对柯里化了解多少?

柯里化: 柯里化是一个高阶函数,它可以将多个形参的函数转成单一的形参的函数

代码实现:其实柯里化函数的核心点主要在args.length和fn.length的判断,当传入的参数个小小于原始函数的参数个数,则继续柯里化

function curry(fn, ...args) {
    return function (...params) {
        const _args = [...args, ...params];
        if (_args.length >= fn.length) {
        	return fn(..._args)
        } else {
        	return curry.call(this, fn, ..._args)
        }
    }
}

Json.parse和Json.stringify的实现

这题没能回答出来,虽然知道大致的核心逻辑,面试的时候比较乱,个人认为这个题目可能是要思路而已,如果真的要立马写代码量还是不小,而且是笔试

具体答案:一文彻底弄懂JSON.parse()与JSON.stringify() - 知乎

公司B

这家公司技术面就是直接发一个需求文档,做出来后也没有回音不知道是不是白嫖党,略过吧,对这家公司印象也很差,不知道大家面试过程中有没有遇到这种公司。

公司C

vue3的时候ref为什么要使用.value属性? 如果是你有什么办法更好的实现它吗?

.value属性,首先我们要知道vue3是基于proxy和reflect实现的响应式数据的,proxy能代理的东西是什么?

答案是对象,那么其实就不难猜出为什么ref要.value

那么有什么更好实现ref,这里其实想问的是.value访问太麻烦,而且容易搞混,近期对于ref的争议也很大,也有人提出ref sugar即(ref语法糖),也就是去除ref,那么如何去除?

核心就是对set和get进行操作

get(target, key) {
    if (key === 'value') {
    	return target.value
    }
    return target.value[key]
},

核心内容就是如下,因为vue模板编译的时候会自动取value,所以要判断key为value的情况下,最后return target.value[key]则是我们正常在js里不通过value进行访问的逻辑

function magicRef(initialValue) {
  const reactive = ref(initialValue)
  const proxy = new Proxy(reactive, {
    get(target, key) {
      if (key === 'value') {
        return target.value
      }
      return target.value[key]
    },
    set(target, key, value) {
      if (key === 'value') {
        target.value = value
      } else {
        target.value[key] = value
      }
      return true
    },
  })
  return proxy
}

SSR渲染流程是什么样?

  1. 客户端发送URl请求到服务端
  2. 服务端查询数据库
  3. 拿到数据,组合好页面
  4. 服务端返回整个DOM结构给客户端

vuex如何解决页面刷新丢失数据的问题?

  • 通过本地储存解决localStorage或sessionStorage存储
  • 通过插件vuex-persistedstate解决

后台系统中权限是实现到什么等级? 具体怎么实现的

目前大多数的是实现到按钮级,实现的方法是通过自定义指令

流程具体如下:

  • 从服务器一个对象,对象里包含了所有按钮的权限
  • 给按钮添加自定义指令,并且为每个按钮传递不同参数
  • 通过自定义指令的bind生命周期设置按钮的display控制是否展示按钮或者直接删除元素

说说对于vite和webpack的理解

webpack和vite都是很好的打包工具,对于webpack,在大型项目中,构建比较蛮,因为它需要对文件执行多次扫描和转译,从而衍生出了vite,vite是以开发模式极速构建著称,它利用了ES模块的特性,只构建正在编辑的模块,而不是项目,真正做到按需引入。

但是webpack目前的插件生态会相对丰富,对于vite插件相对较少,同时对于项目的话个人认为webpack适合大型项目,vite适合中小型项目

import 和 require的区别

  1. 首先是标准不同import/export是ES6标准, require和module.exports是CommonJS的标准
  2. 执行过程,require是运行时才执行即同步加载,import是编译时执行异步加载
  3. require的性能会相对稍微低于import

去除字符串中出现次数最少的字符,不改变原字符串的顺序

const removeLeasetFrequenChar = (str:string) => {
  const charMap:any = {};
  for(let i = 0; i < str.length; i++) {
    const char = str[i];
    if (charMap[char]) {
      charMap[char] = charMap[char] + 1;
    } else {
      charMap[char] = 1;
    }
  }
  // 找出最少次数
  let minChar:string = '';
  let min:number = Infinity;
  for(let i in charMap) {
    if(charMap[i] < min) {
      minChar = i;
      min = charMap[i]
    }
  }
  // 直接把原本字符串处理,替换空
  return str.replace(minChar, '');
}

如何控制请求并发数量?

这里问的应该是Promise.all如何控制请求的并发量,核心点如下

  • 按照最大并大量对请求进行分组
  • 然后利用async await的特性,分组请求
// 请求url数组
const urls:Array<string> = [
  'https://www.baidu.com/s?wd=1',
  'https://www.baidu.com/s?wd=3',
  'https://www.baidu.com/s?wd=2',
  'https://www.baidu.com/s?wd=2',
  'https://www.baidu.com/s?wd=2',
  'https://www.baidu.com/s?wd=2',
  'https://www.baidu.com/s?wd=2'
]
// 最大并发量
const maxRequest:number = 3;
// 请求
const fetchUrl = (url:string) => {
  return new Promise((resolve, reject) => {
    fetchUrl(url).then(res => resolve(res)).catch(err => reject(err))
  })
}
// 分组的方法
const grouping = (arr:Array<string>, num:number) => {
  let result:Array<Array<string>> = [];
  for(let i = 0; i < arr.length; i+=num) {
    result.push(arr.slice(i, i + num));
  }
  return result;
}
// 进行分组
const urlGroup = grouping(urls, maxRequest);
// 分组请求
const maxNumRequest = async () => {
  try {
    for(let urls of urlGroup) {
      const promiseArr: Array<any> = urls.map(url => fetchUrl(url));
      // 核心点在这里 利用async await 分批请求
      const reuslts = await Promise.all(promiseArr);
      console.log(reuslts);
    }
  } catch (error) {
    console.log(error);
  }
}

公司D

讲一讲vue3的生命周期以及它们的作用

vue3的生命周期主要有4个阶段9个钩子分别是:

  • 创建 ——在组件创建时执行
  • 挂载——DOM被挂载时执行
  • 更新——当响应式数据被修改时执行
  • 销毁——在元素销毁之前执行

钩子函数分别有:

  • beforeCreate—— 初始化事件以及生命周期,此时data和dom都为创建无法问题
  • created——创建后,此时已经初始化完毕,data已经可以访问,但是dom元素依然不行
  • onBeforeMount ——在挂载开始之前调用,此时dom元素已经生成,但是未挂载到页面上,可以进行异步操作
  • onMounted—— 组件挂载时调用,此时可以访问dom元素,可以进行异步操作
  • onBeforeUpdate ——数据更新前调用,这里可以访问更新前的dom,通常用来移除事件监听
  • onUpdated—— 由于数据改变更新dom之后调用,这里可以访问更细后的dom
  • onBeforeUnmount——卸载组件之前调用,通常用于清除计时,以及事件监听
  • onUnMounted—— 组件卸载之后调用,可以用于清除一些资源占用

另外补充vue2生命周期

  • beforeCreate: 创建前,初始化事件以及生命周期,此时data和dom都为创建无法问题
  • created: 创建后,此时已经初始化完毕,data已经可以访问,但是dom元素依然不行
  • beforeMounted: 挂载前,此时dom元素、data、计算属性等已经生成,但还dom未挂载到页面上面,可以进行异步操作
  • mounted: 挂载后,此时dom元素已经挂载完毕,可以访问dom,可以进行异步操作
  • beforeUpdate: 更新前,此时可以获取到更新前的dom元素,可以对更新前的状态进行保存
  • update: 更新后,此时页面已经更新完毕,可以访问更新后的dom元素
  • beforeDestoy: 销毁前,组件销毁之前调用,通常用来清除计时器、事件监听、
  • destroyed: 销毁后,此时dom元素已经卸载,可以释放组件用过的资源等操作

setup什么时候执行?

setup在beforeCreate之前执行,在组合式api中setup生命周期取代了beforeCreate和created两个生命周期。

异步请求放在created和mounted哪个合适?create会不会有性能提升?

异步请求放在create和moutned都是可以的,放在created更快的说法,性能并没有多少提升

  1. created和mounted两者生命周期执行间隔差距其实很小,甚至到几微米
  2. 如果说再created请求数据,请求后需要对数据进行操作,那么就得插入到主线程中,那么我们就需要打断x渲染线程
  3. 除此之外有时候请求后我们需要对dom进行操作,那么created生命周期还没讲dom元素挂载上此时操作时不适合的

另外如果是服务端渲染(ssr)是需要放到created里进行异步请求,因为服务端不支持mounted

怎么看待CompositionApi和Options Api?

我认为两种api各有各的优缺点,在OptionsAPi,我们对一个options进行配置包括了,props、data、methods、computed等这种方式在结构清晰、易于理解,在小型的项目中比较实用.而在大型项目中CompositionAPi会更加适用

CompositionApi来说,它通过函数的形式来组织我们的代码,让我们允许把相关功能组合在一起,提高代码可维护性和重用性。

例如: 当我们实现一个todoList

在OptionsApi中我们得去data里声明一个list,然后再去methods声明一个方法,最后再去声明周期里调用等

而在CompositionApi我们声明list和methods都可以放在一起,同时如果将来需要复用此功能,只需要在将这一块的代码复制,而OptionsAPi则要去data里找,再到methods里找

vue2对比vue3做了哪些改进?

  • 性能的优化 vue3采用Proxy替代Object.definedPropety实现响应式,并且使用的静态提升技术,提高渲染的性能,但是对于proxy有一个缺点对ie11不支持
  • 组合式api可以更好的复用组件逻辑
  • TypeScript支持,vue3已经完全支持Typescript
  • 新的自定义渲染Api,Vue3对于生命周期组件事件等都需要进行自定义以及控制

Proxy和Object.defineProperty的区别

  1. 性能方面Proxy的性能优于Object.definePropety
  2. 拦截对象不同,proxy可以对整个对象进行控制,Object.definePorpety只能对象单个属性控制,这也是为什么Vue2要使用Vue.$set去设置属性的原因
  3. Object.definePropety是对原始的对象进行操作,而Proxy会在原始对象上面创建一个代理层,Object.definePropety操作原始对象就可以触发拦截器,而Proxy则要操作代理对象
  4. 兼容性的区别Object.definePropety兼容性相对较好,Proxy无法兼容IE11

公司E

css的三大特性,有哪些属性可以被继承

css三大特性: 继承性、层叠性、优先性

可以继承属性有: font-size;font-family;font-style;text-align;line-heightcursor等等

浏览器从输入到渲染的过程经历哪些过程?

这题面试的时候只答出了DNS查询、构建DOM树、构建CSS树、组合合成渲染树有些给忘记了 晕

详细的步骤如下:

  • DNS查询服务器IP
  • TCP三次握手
  • TLS协商
  • 发送GET请求HTML文件
  • 将HTML内容构建DOM树
  • 将CSS内容构建CSSOM树
  • 将DOM树和CSSOM树合成渲染树
  • 根据渲染树进行页面元素的布局
  • 绘制到页面上

for in循环对象的时候是有序的吗

无序的,for in循环的时候,不要依靠顺序去进行判断。

前端做过哪些优化

  1. 一些第三方库通过CDN方式引入
  2. 使用iconfont代替图片图标
  3. 图片懒加载
  4. 代码层面例如防抖节流 频繁切换的场景 使用v-show替换v-if
  5. 利用webpack-boundle-analyzer分析打包后文件大小,进行优化

前端图片懒加载的原理?

核心原理是通过判断图片元素是否显示在视图中,如果显示在视图中即显示图片,据图步骤如下:

  1. 声明img标签但是src属性为空,我们可以另外设置一个自定义属性data-src用来赋值图片的url
  2. 然后就是监听scroll事件,同时sroll事件可以加上节流,减少资源浪费
  3. 判断当前图片是否有在可视范围内,判断方法有多种,例如: offsetTop+offsetHeight > scrollTop或者getBoundingClientRect判断 top和left小于视窗高度(clientHeight)
  4. 如果是的情况下我们获取这个img元素的data-src然后把属性赋值src即可

说说网络错误码有哪些? 分别代表什么意思

这里我只答出200、404、500、304

网络错误码: 以下面前缀开头分别代表不同的错误

  • 1 开头 表示消息
  • 2 开头 表示成功
  • 3 表示 重定向
  • 4 表示 客户端错误
  • 5 表示 服务器错误

1XX段:表示请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息

常见的有:

  • 100(客户端继续发送请求,这是临时响应)
  • 101(服务器根据客户请求切换协议)

2xx段: 表示请求已成功被服务器接收、理解、并接受

常见的有:

  • 200(成功): 请求已成功,并且返回所希望的响应头和数据体
  • 201 (已创建): 请求成功并且服务器创建了新的资源
  • 202 (已创建): 服务器已接收请求,但是尚未处理完成
  • 203(非授权信息): 服务器已成功处理请求,但返回的信息可能来自另一来源
  • 204(无内容): 服务器成功处理请求,但无返回内容
  • 205(重置内容): 服务器成功处理请求,但没有任何返回内容
  • 206(部分内容): 表示服务器成功处理了部分请求,通常在断电续传或者分块下载使用

3xx段: 表示完成请求,需要进一步操作。

常见的有:

  • 300(多种选择):针对请求,服务器可执行多种操作
  • 301(永久移动): 请求的页面已永久移动到新位置
  • 302(临时移动): 服务器目前从不同位置的页面响应请求
  • 303(查看其它位置): 请求者应对不同的位置单独使用get请求来检索响应
  • 304(协商缓存): 服务器通过状态304可以告诉客户端请求资源成功
  • 305 (使用代理): 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理
  • 307 (临时重定向): 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

4xx段: 表示服务器无法处理请求,客户端错误

常见的有:

  • 400(错误请求): 服务器不理解请求的语法
  • 401(未授权): 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 403(禁止): 服务器拒绝请求
  • 404(未找到): 请求的资源不存在
  • 405(方法禁用): 禁用请求中指定的方法
  • 406(不接受): 无法使用请求的内容特性响应请求的网页
  • 407(需要代理授权): 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
  • 408(请求超时): 服务器等候请求时发生超时

5xx段: 表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生

常见的有:

  • 500(服务器内部错误):服务器遇到错误,无法完成请求
  • 501(尚未实施):服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码
  • 502(错误网关): 服务器作为网关或代理,从上游服务器收到无效响应
  • 503(服务不可用): 服务器目前无法使用(由于超载或停机维护)
  • 504(网关超时): 服务器作为网关或代理,但是没有及时从上游服务器收到请求
  • 505(HTTP 版本不受支持): 服务器不支持请求中所用的 HTTP 协议版本

箭头函数和普通函数的区别?

  • 箭头函数没有原型,所以箭头函数没有this
  • 箭头函数this继承外层的第一个普通函数
  • 不能直接修改箭头函数的this指向
  • 箭头没有argements
  • 箭头函数只能声明匿名函数(箭头函数可以通过表达式让箭头函数具名),普通函数可以是具名函数也可以是匿名函数

var和let有什么区别?

  • var和let都有变量提升,但是let有一个暂时性死区
  • var是函数作用域let是块级作用域
  • var可以重复声明,而let不行

公司F

为什么要使用Ts

  • ts可以对代码类型进行检查,避免了js遇到一些错误
  • ts可以改进js,同时规范化我们的代码
  • ts附带了许多功能,可以协助我们开发
  • ts使得代码容易阅读和理解

什么是Ts的方法重载?

方法重载:是一种特性,允许生命多个不同的函数签名,根据传入的参数来执行不同的操作

function sayHello(name: string): string;
function sayHeelo(name: string, age: number): string;

上面两句代码定义了两个函数签名,如果传一个name就执行第一个操作,如果传入name和age就执行第二个

但是下面我们还需要提供一个函数来实现相应的操作

function sayHello(name: string, age?: number): string {
    if (age !== undefined) {
        return `Hello, ${name}! You are ${age} years old.`;
    } else {
        return `Hello, ${name}!`;
    }
}

谈谈ts的枚举

枚举是Ts的一种数据类型,它能允许我们定义一组命名常量,枚举可以帮助我们把需要的集合列举出来,方便使用,也更加的简洁明了。

enum Gender {
  Male,
  Female,
  Other
}

ts的内置类型有哪些?

  • number
  • string
  • null
  • undefined
  • boolean

高级数据类型有:

  • Array
  • Tuple
  • Enum
  • Any

刚刚你谈到了Tuple它有什么作用? 有什么特点?

Tuple又称为元组,它是一个有顺序的数据类型,有以下特点

  • 明确知道数组的长度,并且知道元素类型
  • 可以知道每个元素的所在的位置
  • 长度固定,因为需要对每个元素定义类型
type tupleNum = [string, number]

type和interface有什么区别?

  • interface可以重复声明,type不行
  • tyoe可以用typeof去获取某个一数据类型
  • tyoe支持使用in去遍历映射类型
type names = 'firstName' | 'lastName' | 'AKA'
type nameType = {
    [key in names]: string
}
  • 模块化导出type必须先声明再导出
export default interface User {  
    name: string
    age: number
}
type User = {
    name: string
    age: number
}
export default User

ts的never和vioid有什么区别

  • void表示没有任何类型,值可以是null或者undefined
  • never表示这个值永远不会存在

为什么vue的data必须是一个函数? vue是如何实现的data互相不污染?

在组件中,vue其实是通过构造函数去new一个组件,当data是一个函数的时候,它会有自己的作用域,而不会去印象其他的组件,如果说组件的data不是一个函数,而是一个对象,那么会导致这个data会被放到原型上,此时其他实例就可以访问

说说双向绑定的原理

  1. 首先在new Vue的时候会对data里面执行响应化处理,这个过程发生在observer中,通过Object.definePropety对data的属性逐个递归遍历,添加set和get方法
  2. 同时对模板进行编译,这个过程在compile中执行,主要操作有两个,获取data里初始化视频,绑定更新函数
  3. 定义一个Watcher(观察者),功能主要有:添加订阅者和更新
  4. 定义一个Dep用来保存观察者,并且当数据发生更变通知更新

公司G

笔试题目,只记得几题,有些没答出来,答案是后续补上的

如何实现路由懒加载?

在router通过回调的方式引入组件就可以实现异步加载

原理:主要是因为javscipt运行机制、事件循环以及打包工具的配合

  • 当打包工具遇到import的时候会把这些组件当做单独js文件进行打包
  • 页面加载的时候 ,只有主要boundle会被下载
  • 当用户需要组件的时候,再发起网络请求,请求对应的异步组件
  • 然后进行下载和执行
  • 最后渲染

diff算法原理

diff算法主要是采用深度优先算法,逐层进行比较,具体实现如下:

  • 首先会有两个虚拟DOM树,分为新的子节点集合,旧子节点集合
  • 同时会有4个索引分别指向, 新子节点的首尾,旧的子节点首尾4个,这里以:oldS、oldE、newS、newE代表4个索引
  • 比较的话肯定是 oldS和oldE要分别对newS、newS进行比较就有四种情况了
  • 相等情况分为4种:
  • 1.oldS(旧节点的头)与newS(新节点头相等),那么就oldS和newS分别索引+1
  • 2.oldS(旧节点头部)与newS(新节点的尾相等),那么就是oldS+1然后 newE-1
  • 3.oldS(旧节点尾部)....还有两种情况以此类推
  • 最后会出现一种情况,就是如果存在不相等的节点的时候
  • 会有两种结果
  • new的子节点集合大于旧的子节点集合 ,添加新的子节点
  • 旧的节点集合大于新的节点集合,那么就会真实的DOM中(这里划重点不是在旧节点中)删除多余的子节点

import和require的区别

  • 标准不同 import是ES6的标准,require是CommonJs的标准
  • require是运行时执行,既同步加载,import是编译时执行,既异步加载
  • import会 提升到文件的顶部
  • require的性能稍低于import

es6有哪些新的特性?

  • 类class, extends
  • 箭头参数
  • let const
  • 模板字符串
  • 扩展运算符...
  • 解构赋值
  • import、export
  • Promise
  • Symbol
  • Proxy
  • 函数参数默认值

公司H

如果让你从数组中查找元素你会如何实现?

如果是基础类型的数组考虑使用indexOf进行查找

如果是对象数组则使用findIndex进行查找

indexOf和includes有什么区别?

  • indexOf是返回下标,如果找到返回对应下标如果没有则-1
  • includes返回值是true和false
  • indexOf是严格等于相当于(===)而includes是使用是零等值法 0 可以等于 -0
  • 这里特别说明indexOf中 NAN永远返回-1 ,而 includes NAN可以是true

第三点太难了 在面试的根本想不到

箭头函数的this会指向什么?

箭头函数this通常在创建的时候就已经确定了他的指向,会指向外层的this

以下代码this会指向什么?

    const fn = () => {
        console.log(this);
    }
    const obj = {
        func: fn
    };
    obj.func();

this会指向window,因为它声明的使用会指向外层的this

那么如果箭头函数改成普通函数呢?

    function fn() {
        console.log(this);
    }
    const obj = {
        func: fn
    };
    obj.func();

此时还是指向obj函数会根据执行时,谁调用了它而指向谁

如果箭头函数加上bind,this会指向什么?

依旧指向window,因为箭头函数不可改变this的指向

总结

历经近一个月的时间,我目前已经收到两家的offer,第一家可能不是很满意,拒了,第二家开出的薪资也比较符合我的预期,考虑到目前的环境的情况,我就不做犹豫选择了入职,此文章后续可能不会再继续更新,但是我会努力继续写一些好的文章,分享给大家。感谢各位的关注。

在这里给一些求职者或者将要寻求其他发展机会的人一些拙见

  1. 我感觉国庆后的市场机会多了一些,但是也只是一点,如果说还能撑一撑的伙伴们,我建议还是再撑一撑
  2. 就算换了工作,现在其实很多公司可能给不到你预期的工资,你可能会面临两个问题
  3. 一、选择平跳,就是工资涨幅不大可能福利待遇会好一些的情况
  4. 二、空窗期一段时间,从众多机会中寻找,这个可能就得看运气,具体的时间不好控制
  5. 如果已经处于再寻找工作的人,我建议
  6. 一、面试后及时复盘,面试其实也是对自己进行一个查缺补漏,你会发现很多自己不足,那么既然都要是完了,就不要去在意面试中的问题,及时补上才是王道
  7. 二、尽量不要在家里复习查看面试题,家里可能比较舒适,这样一个环境很难进入学习状态,当然你如果做得到也是狠人,可以忽略我这一点建议,个人推荐去图书馆,因为我近几天去图书馆,你会发现很多人,其实很多人也跟你一样,也许离职了,在寻求新的机会,你并不是孤单的一个人,你没有被世界抛弃
  8. 心态问题,这一点很重要,我心态其实很不好,离职了,就有一种感觉和世界脱轨的感觉,所以需要调整好自己的心态,我自己是周一到周五面试,周末面试官和Hr都在休息了,Boss直聘也没有什么消息,那么我也休息,周末好好出去玩,找朋友聚一聚,谈谈最近自己的情况。也可以喝点小酒放松一下,心态在求职过程中我个人认为是一个极其重要的点。

最后在这里祝大家早日找到心仪的工作。

双目深度相机--10.双目视觉的主要步骤讲解分析 双目视觉技术通过模拟人眼原理,利用两个相机从不同视角采集图像,实现三维坐标计算。其核心流程包括:1)系统标定,消除相机畸变并建立坐标映射关系;2)图像同步采集与预处理;3)立体匹配,寻找左右图像对应点;4)基于视差图的深度计算;5)三维重建生成点云或网格模型;6)结果应用如目标测距、三维建模等。关键技术难点在于精确标定和准确匹配,这两步直接影响最终深度计算的精度。该技术广泛应用于自动驾驶、工业检测、VR等领域,实现了从二维图像到三维空间的精准转换。 阅读详情

相关推荐

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 240

js关于排序方法sort()的一点小问题

今天看到了一道题(来自力扣) 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。 请你找出并返回这两个正序数组的 中位数 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 示例 3:

fengya1112的博客 443

从零开始用飞牛fnas搭建集成DeepSeek-R1的远程AI工作台

从零开始用飞牛fnas搭建集成DeepSeek-R1的远程AI工作台

AI+全栈,AI+应用,实操落地,前沿技术 3807

sort()不稳定,用nums.sort((a, b) => a - b);

nums.sort((a,b)=>a-b);

qq_39976615的博客 1282

2025年(第十一届)全国大学生统计建模大赛论文及选题分析

基于数据驱动决策:整个研究围绕给定的洪水灾害相关数据进行深入挖掘和分析,从数据清洗、特征分析、模型建立到最终预测,每一步都以数据为基础,通过对数据的有效利用来揭示洪水灾害发生的相关规律和特征,为洪水灾害的风险评估和预测提供依据,符合数据引领未来决策的理念。实际应用导向:洪水灾害是现实中严重影响人类生命财产安全和社会经济发展的重要问题,本研究旨在实现对洪水灾害的预测,其成果可直接应用于防洪减灾工作,如洪水预警、风险评估与区划等,对实际防灾减灾工作具有重要的指导意义,体现了以数据为支撑服务实际应用的特点。

qq_52590045的博客 1万+

手把手教你用TiggerRamDisk绕过iPhone/iPad激活锁(支持iOS16.3,Win/Mac双平台保姆级教程)

本文详细介绍了如何使用TiggerRamDisk工具绕过iPhone/iPad的激活锁,支持iOS16.3系统,并提供Windows和Mac双平台的保姆级教程。从工具准备、设备连接到核心解锁流程,一步步指导用户完成操作,帮助二手设备或旧设备重获新生。

weixin_29323493的博客 912

2023年金九银十互联网大厂Java初中高级面试1000问

这份面试总结比较多,就不一一的详细介绍了,粗略的将主要内容展示一下,其中含有20+的知识点:目录总览目录详览基础篇JVM篇多线程&并发篇Spring篇MyBatis篇SpringBoot篇MySQL篇SpringCloud篇Dubbo篇Nginx篇MQ篇Linux篇Zookeeper篇Redis篇分布式篇网络篇设计模式篇maven篇ElasticSearch篇tomcat篇Git篇软实力篇内容一览JVM知识点汇总锁、线程Mybatis。

qq13321123的博客 139

BIDS数据存储格式介绍与dcm2bids安装与使用

BIDS格式&dcm2bids安装与使用

machinelearning_er的博客 7317

就今年这行情,程序员还有金九银十吗?

今年注定是很艰难的一年,我的同学很多都在互联网大厂,年前的时候还说2023年看看机会,但今年这形式,也都苟住不动了。金九银十一般更不会动了,因为再苟一苟就有年终奖了。今年上半年裁员这么多,肯定很多人要找下家的,那就注定很多公司到金九银十的时候并不缺人,而且金九银十一般招的是校招生,是给2024年做人才储备的,现在这种形式,还储备啥啊。除非下半年俄乌战争结束,中美关系重回正轨,否则这个形式,很难看到金九银十了, 应该是铁九铁十了,但看目前的形式,上面几个都非常难。

xiaokangss的博客 360

083、多帧降噪(MFR)与VST算法:低照度场景下的信噪比提升与鬼影抑制

本文深入探讨了多帧降噪(MFR)和VST算法在低照度场景中的应用与优化。作者从实际项目案例出发,指出单帧降噪的局限性,详细分析了MFR的核心原理与工程实现中的关键环节,包括帧对齐、帧选择、融合策略和鬼影抑制等技术要点。文章特别强调VST变换对噪声均匀化的重要性,并分享了实际开发中的调试经验与参数优化技巧,如"三明治"调试法和性能平衡策略。最后指出,优秀的MFR方案需要在信噪比提升、鬼影抑制和纹理保留之间找到场景化的平衡点,建议开发者通过真实场景测试验证算法效果。全文既有理论分析,又包含丰富的实战经验和技术细

zzfmlxs的博客 123

YOLOv8改进 | 融合篇,YOLOv8主干改进融合网络之MobileNetV3+CA注意机制,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。YOLOv8中的主干网络替换成MobileNetV3+引入CA注意机制

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1881

2024转行要趁早!金九银十来啦!盘点网络安全的岗位汇总_2023年金九银十招聘数据

我曾经是一名普通的销售人员,工作了三年,每天重复着相同的工作内容,感觉自己的职业生涯停滞不前,毫无发展前景。我开始思考,如何才能让自己的职业生涯更有意义,更具有挑战性。经过一番调研,我决定转行网络安全工程师。工作了越久,越觉得当初转行网络安全的决定还是非常正确的。目前的收入还比较满意,月入2W+(仅代表个人收入),13薪,年薪有25W。这不是我的目标,会继续努力提升自己的技能,争取有更高的收入。经过半年的学习努力,找到一份月薪10K的工作,加上自己经验的积累,现在收入增加了很多。

jennycisp的博客 1005

工业视觉降本300%实战:C# + 开源YOLO如何干掉Halcon/VisionPro?

在当前制造业普遍追求“降本增效”的大背景下,工业视觉检测系统作为产线的眼睛,其成本问题日益突出。通过该方案,我们成功帮助一家电子厂将单条产线的视觉检测成本从15万降低至不足5千(主要为工控机硬件成本),降本幅度超过95%,且系统稳定性经受住了6个月连续生产的考验。:C#负责“工程化”和“业务逻辑”,YOLO负责“智能算法”,二者结合,完美覆盖了工业视觉从算法到落地的全链路。的组合,构建一套高性能、低成本、易维护的工业视觉解决方案,并彻底替代昂贵的付费库。” 这是一个典型的误区。工业相机/USB相机。

2601_94871597的博客 429

2023金九银十必看前端面试题!2w字精品!

答案:原型链是JavaScript中对象之间的连接关系,每个对象都有一个指向其原型(prototype)的引用。通过原型链,对象可以继承其原型对象的属性和方法。可以使用原型链实现继承,通过将一个对象的原型指向另一个对象,从而使得该对象可以访问另一个对象的属性和方法。答案:事件循环是JavaScript中处理异步操作的机制。事件循环不断地从任务队列中取出任务并执行,直到任务队列为空。事件循环由主线程和任务队列组成,主线程负责执行同步任务,异步任务会被放入任务队列中,等待主线程空闲时被执行。

肥晨开发的学习之路 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

25届秋招还有金九银十?会是“史上最难”?

应届生这个身份无非是在一些事业单位,公务员考试的要求,一些大企业对应届生要求有所放宽。硬性要求变了:事业单位、公务员岗位对应届生不查社保了,毕业年限放宽了;但是今年7月份陆续有山东、贵州、湖南等地的人力资源社会保障厅陆续发布应届生不在查询社保,或者规定毕业3年内都算应届生身份。甚至一些互联网大厂对应届生的定义也变了;腾讯将2024年1月-2025年12月期间的同学都定义为应届生。阿里的淘天集团将2023.11-2025.10月之间毕业的都定义为为了应届毕业生。

liguangyao213的博客 1042

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 字节高级架构师推荐!程序员必读之《软件架构》
下一篇: 10 分钟了解 nextTick ,并实现简易版的 nextTick
Cipher_Y
博客等级 码龄3年 93粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值