• 面试公司:新格尔
  • 面试岗位:南京-web3d开发工程师
  • 面试时间:2025/02/12/09:30
  • 面试时长:技面(30min)+ hr面(30min)
  • 面试体验:良好,虽然回答的不咋样,但是面试官比较有耐心,会纠正和提示你,2场面试面试官都会认真回答问题
  • 技术栈:
    • 几何算法/3D技术/数理逻辑/算法优化/后端技术
    • canvas/webgl/electron/ts/threejs/babylonjs
    • 微信小程序/uniapp/vue3

公司介绍

  • 期待薪资:8k
  • 定制家具产业互联网企业
  • BIM软件
  • 软件:
    • 柜柜App
    • 画门窗
    • 老板良
    • 四合院
    • 门窗CC
    • 测量大师

技术面反问

  1. 方便问一下公司前端使用的技术栈吗
  2. 可以问一下岗位的主要职责和期待人选吗
    • 总重要的是态度吧,需要端正态度,愿意学习web3d技术
  3. 可以介绍一下成为一名在web3d领域比较专业的程序员大概需要多长时间吗?需要掌握哪些技能呢?
  • 这个主要看个人的兴趣和行动吧,如果有足够的驱动力的话,大概1年多就能掌握的比较熟练了
  • 掌握技能
    • 首先,我们是要和vue层进行交互,需要对vue的实现原理非常熟悉
    • 其次,使用的图形库中的api需要足够熟悉,在什么场景下采用什么方案要有自己的判断
    • 最后,我们是门窗行业的,你至少需要知道这个行业对技术层面的实现有什么要求吧

hr面反问

  1. 可以了解一下岗位是否有考核标准和上升空间吗?
  2. 可以介绍一下我所应聘的岗位,部门人员怎样组成的呢
  3. 我个人的理解是:咱们这个岗位对软件开发、图形学、数理逻辑以及业务理解能力要求都比较高
    • 我个人是非常感兴趣的,也愿意积极的了解和学习
    • 方便问一下,您认为要在这个岗位上做的非常出色,需要具备哪些特质呢?

技术问题

js

session、localstorage、cookie区别是什么

说一下宏任务和微任务,宏任务和微任务哪个先执行

说一下堆和栈的区别

  • 堆和栈是2种不同的内存管理方式,用于存储不同类型的数据

  • 堆(Heap)

    • 用于动态分配内存的数据
    • 存储引用类型数据,如对象和数组
  • 栈(Stack)

    • 用于存储基本类型数据,以及函数执行上下文
    • 分配固定大小的内存
    • 内存管理由系统自动处理,通过栈指针的移动来分配和释放内存
    • 在堆中分配的内存不会自动释放,需要垃圾回收机制

说一下浅拷贝和深拷贝

区别

  • 浅拷贝
    • 创建新的数据,这个数据有着原始数据属性值的一份精确拷贝
    • 如果属性是基本值,拷贝的就是基本类型的值
    • 如果属性是引用类型,拷贝的就是内存地址
    • 深层次的引用类型则共享内存地址
    • 浅拷贝实现方法
      • Object.assign
      • 使用扩展运算符实现的复制
      • slice/concat
  • 深拷贝
    • 开辟一个新的栈,两个对象属性完全相同,对应的地址不同
    • 修改一个对象的属性,不会改变另一个对象的属性
    • 深拷贝方式
      • _.cloneDeep()
      • jQuery.extend()
      • JSON.stringify()
        • 缺点:会忽略undefined、symbol、函数
      • 手写循环递归

使用JSON.parse有什么问题

JSON.stringify会忽略undefined、symbol和函数

说一下es6常用的特性有哪些

map和set的使用场景有哪些

es6中promise常用的场景有哪些

  • Promise是异步编程的一种解决方案
  • 使用Promise.then实现链式操作
  • promise有三种状态
    • pending 进行中
    • fulfilled 已成功
    • rejected 已失败
  • 一旦状态改变无法重新修改
  • 用法
    • all 返回所有异步请求的结果,需要所有异步响应状态都成功
    • race 返回最先有响应的异步请求结果
    • allSettled 返回所有异步请求结果,不管请求成功还是失败
    • resolve 返回一个新的Promise,实例的状态是fulfilled
    • reject 返回一个新的Promise,实例的状态是rejected
  • 使用场景
    • 当需要同时获取到几个接口的响应,再执行下一步操作时,使用Promise.all
    • 通过Promise异步请求获取到接口数据之后,执行then操作,进行下一步数据处理

说一下null和undefined的区别

css

可以讲一下什么是bfc吗

  • BFC(Block Formatting Context)
    • 块级格式化上下文(形成一个相对于外界完全独立的空间,让内部的子元素不会影响外部的元素)
    • 是页面的一块渲染区域,有一套自己的渲染规则
      • 内部的盒子会在垂直方向上一个接一个的放置
      • 对于同一个BFC的两个相邻盒子的margin会发生重叠,与方向无关
      • 每个元素的左边距与包含块的左边界相接触(从左到右),即使浮动元素也是如此
      • BFC的区域不会与float的元素区域重叠
      • 计算BFC的高度时,浮动子元素也参与计算
      • BFC就是页面上的一个隔离的独立容器,容器的子元素不会影响外面的元素
  • 如何触发BFC
    • overflow:hidden
    • display:inline-block
    • position:absolute|fixed
    • display:table-cell|flex
  • bfc应用场景
    • 防止margin重叠
      • 解决方法,在其中一个盒子外面包裹一个div盒子
    • 清除内部浮动
      • 解决方式:父组件overflow:hidden
    • 自适应多栏布局:左边使用浮动,右边栏左侧与父盒子的左边栏相触,
      • 解决方法:给右边栏添加overflow:hidden

可以讲一下iframe的缺点吗

优点

  • iframe能够显示嵌入的网页
  • 可以实现头部、菜单、尾部组件不变,仅仅对iframe嵌套部分修改页面内容,实现代码复用

缺点

  • iframe会阻塞主页面的onload事件
  • iframe和主页面共享连接池,浏览器对相同域连接数量有限制,影响页面的并行加载
  • 使用iframe不利于seo优化
  • 对很多移动设备而言,iframe兼容性差
  • 使用iframe会增加服务器的http请求

如何实现一个宽度为0.5px的线宽边框呢

  • 使用box-shadow实现
  • 使用border+transform-scaleY缩放
  • 使用伪元素选择器:after/:before + transform-scaleY缩放

大屏的响应式大小是怎么做的

html

href和src的区别是什么

  • 请求资源类型不同
    • href:用来简历当前元素和文档之间的链接,常用有link/a
    • src:会将其指向资源下载并应用到文档中,常用有script/img/iframe
  • 作用结果不同
    • href用于文档和资源之间建立关系
    • src用于替换当前内容
  • 浏览器解析方式不同
    • href:浏览器会识别文档为css,并行下载资源并且不会停止对当前文档的处理
    • src:会暂停其他资源的下载和处理,直到该资源加载、编译、执行完毕,将所指向资源应用到当前内容,因此建议将js脚本放在尾部执行

vue

了解vue的mixin吗

  • mixin是面向对象程序设计语言中的类,其他类可以访问mixin类的方法而不必成为其子类
  • mixin类常用作功能模块使用,在需要该功能时进行混入,利于代码复用避免多继承的复杂
  • Vue的mixin
    • 用来分发vue组件中的可复用内容
    • 本质是一个js对象
    • 当组件使用mixins对象时,所有mixins对象的选项都被混入该组件本身的选项中
    • vue支持局部混入和全局混入
      • 局部混入
        • 定义一个mixin对象,有options的data、methods属性,组件通过mixins属性调用mixin对象
      • 全局混入
        • Vue.mixin({created:()=>{}})
        • 常用于插件的编写
    • 组件的选项会覆盖mixin的选项
    • 如果相同的选项是生命周期钩子,会合并成数组,先执行mixin的钩子,在执行组件的钩子
  • 使用场景
    • 定义一个modal弹窗组件

说一下hash和history的区别

能说一下v-model的实现原理吗

如果不是绑定的value,v-model是如何实现绑定的呢

  • 原生v-model:可以看成是value和input的语法糖
  • 自定义:prop传入值,在子组件中通过emit事件对prop进行更新

说一下父子组件的生命周期调用顺序

项目问题

有用过canvas画图的一些库吗

看到你用到了若依框架,当菜单过多时有遇到过栈溢出的情况吗

什么场景用到websocket了呢

uniapp实现的小程序如何实现登录功能

  • wx.login获取用户的code,判断用户是否授权读取用户信息
  • 调用wx.getUserInfo读取用户数据
  • 通过wx.request请求业务方服务器,后端把appid、小程序密钥、code一起发送到微信服务器
  • 服务器返回了openid及会话密钥session_key
  • 后端从数据库查找openid
    • 没找到,用户没注册
  • session_key是对用户数据进行加密签名的密钥
  • 生成session返回给小程序,存入storage
  • 下次请求时,从storage里读取,发送给服务端
  • 服务端比对session记录,校验有效期

其它问题

  • 之前做的App的直播是怎么实现的,App里的3d交互实现的具体内容是什么
  • electron做的项目是包壳还是什么,里面包的是链接吗
  • 有没有开发过需要和桌面硬件进行联动的项目
  • 能接受从threejs转Babylonjs吗

HR面试

  • 可以简述一下过往公司是做什么的,公司规模以及研发团队规模吗?
  • 可以介绍一下你在每家公司的离职原因吗?
  • 可以简述一下你在上份工作中负责的模块吗?
  • 除了工作之外,你还有其它爱好吗?
  • 你的朋友对你的评价是什么?
  • 你是如何看待加班的?
  • 你的职业规划是什么?
  • 有没有朝管理方向发展的意向?
  • 目前有没有收到其它公司的offer
  • 上学期间成绩怎么样