以下是本人2025找工作面试的题目:
---更新2025-3-27面试 设计院---
笔试的题目很简单,看了下只有一题是我不太确定的,那个题目也是很经典,考察的是对象调用者,this指向的问题
var obj = {
name: 'freddy',
say:function(){
return this.name;
}
}
var result = obj.say
var result2 = result()
console.log(result2) // undefined
var obj = {
name: 'freddy',
say:function(){
return this.name;
}
}
var result = obj.say()
var result2 = result
console.log(result2) // freddy
var obj = {
name: 'freddy',
say:function(){
return this.name;
}
}
var result = obj.say
console.log(result()) // undefined
var obj = {
name: 'freddy',
say:function(){
return this.name;
}
}
var result = obj.say()
console.log(result()) // ReferenceError: result is not defined
有么有了解ES6之类的新语法
听到这个问题,我就想到很多年前ES6新的东西,但是我在想者都熟悉透了,现在最新的语法不单是到这了,都发展到了ES2024了,还问我只这些语法,就瞬间觉得面试官是不是很久没去看新知识了
从我做他们的题目,笔试和上机,我看了一遍项目架构,一眼就觉得好low,还有很多优化的地方
promise \ async await async不一定要是有await
解构 经典
剪头函数 烂大街
赋值运行 ?? ?= ? 等
数组 findLast findLastIndex
symbol
这个东西我在项目还真没用过,只回答了是个基本数据类型,在内存存的是数据
查资料补缺
唯一性
解决作用域被覆盖的问题
有symbol.for()
取值 Object.Object.getOwnPropertySymbols(obj) // []
Reflect
const symbolKey = Symbol('key');
const obj = {
[symbolKey]: "Hello, symbol!"
};
const value = Reflect.get(obj, symbolKey);
console.log(value); // 输出: Hello, symbol!
let const var 的区别
1、let 和 const 两者存在块级作用域, 而 var 不具有自己的作用域
2、变量提升: var存在变量提升,let和const不存在变量提升.
3、var声明变量时,可以重复声明变量,而let const则不可以重复声明 后声明的同名变量会覆盖之前声明的变量。
4、初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。
arcgis 和 三维 3D动画
react 和 vue 区别
1. 项目使用了什么技术,有遇到什么难点,或者有没有遇到让你觉得很难忘的事。
* 页面返回滚动到固定位置,再首页失效
-- 解决方法使用ref操作dom
-- 后来发生是vue-router版本不对,项目使用了3.2.0,滚动行为api- scrollBehavior 需要4.x.x版本以上
* 读取图层数据做成一个table,没法知道总数,还要实现模糊搜索
2. 目前是不是在职?
3. js有那些基本类型和引用类型?区别是什么
- 基本类型:String、number、bloolen、symbol、null、undefined
-引用类型:对象obj 、 函数function、 数组 、Date 、RegExp (指针指向)
从内存角度来说,基本数据类型在内存中占据一块空间,空间里存储的就是数据 , 获取数据是直接获取。引用数据类型在内存中占据两块空间,第一块空间存储的是地址,第二块空间存储的是数据。获取数据是间接获取。
从赋值角度来说,基本数据类型赋的是值,引用数据类型赋的是地址。
从函数传参角度来说,基本数据类型传的是值,引用数据类型传的是地址
4. 引用类型防止篡改的问题(引用类型经常会产生一些无法意识到的副作用)
- 采用深拷贝
- 4.1 通过 JSON 对象实现深拷贝 JSON.stringify 、 数组: arr.slice(0)
- 4.2 解构 […arr]
- 4.3 使用递归的方式实现深拷贝
- 4.4 通过jQuery的extend方法实现深拷贝
- 4.5 Object.assign()拷贝
- 4.6 lodash函数库实现深拷贝 - lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝
- 4.7 immer.js提供具有副作用的逻辑都可以放进 produce 的第二个参数的函数内部进行处理。在这个函数内部对原来的数据进行任何操作,都不会对原对象产生任何影响。
5. setTimout()函数里面指定的运行时间,一定就是按定义的时间输出内容吗?
setTimeout(function(){
console.log(‘hello world’);
},0);//虽然此处异步任务时间间隔为0,但仍然排在同步队列之后执行,
所以这里的时间就不一定是一开始就执行了
6. 说下js的事件循环机制(EventLoop)
7. useMemon\useCallback的使用
8. react与react nactive的区别
9. 使用reactJS你经常使用那些钩子函数,他们的作用是什么
10. 说说react diff算法
10. 说说react 组件有哪几种写法
11. 302/301状态码
12、自己对工程化的理解和实践
13、讲一讲如何从零打造一个工程
14、uniapp编译不同平台的原理
15、vue与react的区别和特点
template 比较死板 react jsx 比较灵活
vue偏向mvvm模型 react偏向mvc模型
vue 是双向数据响应 react是单向数据流
16、react中强调数据不可变的,你是怎么理解
Setstate不能在原有的数据state上操作,必须再返回一个新的,通过数组的解构之类返回
17、修改 React 中 state 里的嵌套对象
使用 Object.assign() 方法
Object.assign() 方法可以用来合并多个对象,并返回一个新的对象。这种方法可以确保我们不会直接修改原始对象,而是创建一个新的对象,从而触发组件的重新渲染。
例如,假设我们有以下 state 结构:
this.state = {
data: {
user: {
name: 'John',
age: 30
}
}
};
如果我们想修改 name 属性,可以这样做:
updateName = (newName) => {
this.setState({
data: Object.assign({}, this.state.data, {
user: Object.assign({}, this.state.data.user, {
name: newName
})
})
});
};
使用扩展运算符
另一种更简洁的方法是使用扩展运算符(…),它可以展开对象并创建一个新的对象。这种方法同样可以确保我们不会直接修改原始对象。
例如,我们可以这样修改 name 属性:
updateName = (newName) => {
this.setState(prevState => ({
data: {
...prevState.data,
user: {
...prevState.data.user,
name: newName
}
}
}));
};
总结
在 React 中修改嵌套对象时,我们需要确保不会直接修改原始对象,而是创建一个新的对象。这可以通过 Object.assign() 方法或扩展运算符来实现。这两种方法都可以确保组件能够正确识别状态的变化,并触发重新渲染。
通过以上方法,你可以安全地修改 React 中 state 里的嵌套对象,确保组件的正常运行和更新。
18、vue2 和 vue3 区别
1.写法上的区别: vue2 使用的是options(选项)Api,vue3 的是composition Api(当然 vue3 也兼容composition api)。options Api中methods,compute,data等 api 都是分散的。而composition api中的代码是根据逻辑功能来组织的, 我们可以将一个功能所定义的methods,compute,data等 api 会放在一起, 让我们可以更灵活地组合组件逻辑。
2.vue2 将响应式数据放到 data 函数中, 而 vue3 则是使用ref和reactive将数据声明为响应式
3.响应式实现方式: vue2 中是通过Object.defineProperty对数据劫持实现的, vue3 中则是使用Proxy对数据代理实现的。
4.生命周期区别: vue3 中将beforeCreate和created合并到了setup函数中
5.根节点: vue3 组件允许多个根节点, 而 vue2 只允许一个
6.内置组件: vue3 新增了传送组件Teleport和异步依赖处理组件Suspense、frame
19、Vue 3相对于Vue 2的主要改进包括:
(1)使用Proxy代替Vue 2中的Object.defineProperty,提供了更完善的响应式系统,能够更好地支持非对象的响应式数据。
(2)提供了Composition API,用户可以更灵活地组合和重用代码。
(3)增加了Fragment、Teleport、Suspense等组件,提供更强的组件结构。
(4)创建了更好的生命周期钩子,例如onRenderTracked和onRenderTriggered,可以更好地跟踪依赖和触发重新渲染。
(5)引入了新的打包工具Vite,可以提供更快的热重载和项目启动速度。
(6)提供了更好的TypeScript支持。
(7)优化了渲染机制,包括SSR的改进和更好的Batching更新机制,可以提高性能。
(8)移除了一些不推荐使用的选项,如data必须为返回一个对象的函数等。
(9)提供了更好的自定义渲染API,可以更容易地集成非DOM平台。
(10)提供了更好的与Treeshaking友好的代码分割,可以更好地在生产环境中分离代码。
20、简述setup()函数在Vue 3中起什么作用 ?
setup() 是 Vue 3 组件选项 API 中的一个新选项。它是 Composition API 的入口点,在组件被创建之前执行,用于初始化状态、计算属性和方法,并返回在模板中使用的响应式引用
21、简述请解释Vue 3的Composition API是什么 ?
Composition API 是一组新的、基于函数的 API,它允许你以更灵活和可复用的方式组织组件逻辑。它主要包括 ref、reactive、computed、watch、setup 等函数和钩子
22、key的作用和原理?
(1)key的作用主要是为了高效的更新虚拟DOM,其原理是Vue在Patch过程中通过key来判断是否为同一个,从而避免频繁的操作dom,使得整个Patch过程更加高效,减少dom操作,提高性能。
(2) 另外,如果不设置key vue在列表更新的时候还可能产生不可避免的bug。
(3)vue在使用相同标签元素进行过渡切换时,也会使用到key属性,其目的也是为了让vue区分他们,否则vue只会替换其内部属性而不会触发过渡效果。
23、Vue 3 的 <Suspense> 组件详解?
是 Vue 3 中引入的一个内置组件,用于处理异步组件的加载状态。它允许你在异步组件加载完成之前显示一个备用内容(如加载动画或占位符),从而提升用户体验。