记一次公司前端的面试题

最近老板让我负责前端面试,然后我就出了以下题目。公司业务偏向小程序这块,所以vue啥的基本上没问,都是偏基础问题。因为也没这方面的经验,所以有问题,希望各位大佬指正。
话不多说,直接上题

题目

  • JavaScript的数据类型

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(ES6)。
引用数据类型:对象(Object)、数组(Array)、函数(Function)。

个人认为这个是很简单的问题了,但是可惜的是八成的人都答不全。 希望听到的答案是:分为值类型和引用类型,分别是巴拉巴拉的。

  • 深拷贝和浅拷贝的区别,以及怎么实现对象的深拷贝

希望的答案:
1.通过 JSON.stringfy 对象将对象转成字符串,再将字符串用JSON.parse解析成对象(弊端:值包含undefined、function、symbol时会被忽略)。
2.递归复制。

    //递归复制
function deepCopy(obj) {
      var result = Array.isArray(obj) ? [] : {};
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === 'object') {
            result[key] = deepCopy(obj[key]);   //递归复制
          } else {
            result[key] = obj[key];
          }
        }
      }
      return result;
    }
复制代码

3.各种库(lodash、jQuery之类)都有深拷贝相关的方法
七成以上甚至连引用类型都不知道,所以走不到这一题上面来。然后部分知道的,只能基本上只能说出一种方法,已经算不错的了。

  • 简述一下js的闭包作用和实现

简单讲就是形成一个不被销毁的栈环境。可以用来实现变量私有化和创建静态方法(直接通过类名调用,而不需要实例化)。
简单的实现:

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
 
add();
add();
add();
// 最后counter的值为3
复制代码
  • var let const之间的区别。

区别也挺多的,还是多多益善,一般人都能说出几个。比如作用域区别,const是常量。其实这些已经差不多了,但是如果能再说点其他的,会非常加分。

  1. 暂时性死区:只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
    下面代码会报错就是因为暂时性死区,定义很绕口,但是能知道下面情况什么时候会发生,就好了,或者知道存在这个。
var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
复制代码
  1. letconst不允许重复声明。并且const只能在声明的时候赋值(这个比较简单,但是很多人真的不知道)。
  • ES6和ES5差异,或者说ES6相较于ES5增加了哪些内容

非常多,基本上没人能全部说出来,但是多多益善,尽量多说几个吧。
可以在这里看看,es6.ruanyifeng.com/ 如果能说出几个不常见的点,也是非常加分的。

  • css选择器权重方面的:

最基本的:!important(无限大)>内联(1000)>ID选择器(100)>class选择符(10)>标签选择(1)
加分项:属性选择器或伪类(10)、伪元素(1),通配选择器*(0)等等。

  • 说一下微信小程序的性能优化(微信小程序是公司主要的业务)

这个也很多,懒加载、减少setData的次数和不必要的setData,列表渲染的时候加上key,合理使用缓存,合理利用事件通信等等。

  • token和cookie的区别

又是一个能说很久的话题,尽量多说吧,这里不做赘述,推荐一个文章,www.jianshu.com/p/c33f5777c… 。也可以自己百度

  • 简单说一下vue双向绑定的实现

考一下对框架底层的了解,没人指望你实现一个vue,但是学习别人的思想和原理,对于自己平时技能的提升,很有帮助。
简单点答就是:vue3.0之前是利用Object.defineProperty重写get和set,vue3.0是利用Proxy。 具体实现原理,这里也不赘述了,以后会出文章专门写。

写在最后

用这套题面试了十个人左右了,大部分都是三年左右的前端,最厉害的也只能答出来六七成,大部分人只能答出三成,我都怀疑是不是题目太难了。唉~心累。

个人感觉都是一些基础知识,很少问框架相关的,因为我觉得基础好了,框架应该没啥大问题。这些题目,也是我以前面试经常遇到的一些,所以才出的这些。

高级前端开发职位的面试通常会涉及较为深入的技术问题,涵盖现代前端框架、性能优化、工程化、安全等多个方面。以下是一些典型的高级前端面试题及其详细解析: ### 什么是 Virtual DOM?它是如何提升性能的? Virtual DOM 是一种将 HTML 和 JavaScript 结合起来,以组成一种虚拟的 DOM 对象的技术。它可以将开发人员的修改操作转换为最小化的更新操作,提高页面的性能和响应速度[^2]。 其核心机制是通过在内存中构建一个与真实 DOM 对应的树形结构,在状态发生变化时,先进行虚拟 DOM 的更新与差异比较(diff 算法),然后将最终需要更新的部分批量同步到真实 DOM 中,从而减少直接操作 DOM 带来的性能损耗。 ### Proxy 在前端开发中的常见用途有哪些? Proxy 可用于多种场景,包括 API 请求拦截、数据劫持、响应式系统实现等。例如,在 Vue 3 中,Proxy 被用于实现响应式数据系统: ```javascript function reactive(obj) { return new Proxy(obj, { get(target, key) { track(target, key); //依赖收集 return Reflect.get(...arguments); }, set(target, key, value) { trigger(target, key); //触发更新 return Reflect.set(...arguments); } }); } ``` 此外,Proxy 还可用于统一处理 API 请求错误、日志录、权限控制等逻辑[^3]。 ### 如何使用 Webpack 进行项目打包优化? Webpack 是现代前端项目常用的模块打包工具。为了优化打包结果,可以采取以下策略: - **代码分割(Code Splitting)**:利用 `import()` 动态导入语法或 `SplitChunksPlugin` 将代码拆分为多个 chunk,按需加载。 - **Tree Shaking**:通过 ES6 模块静态导入特性移除未使用的代码,减少体积。 - **懒加载(Lazy Loading)**:对路由组件或非首屏资源延迟加载,提升首屏加载速度。 - **缓存策略**:使用 `cache-loader` 或 `hard-source-webpack-plugin` 缓存中间编译结果,加快二次构建速度。 - **压缩优化**:启用 `TerserPlugin` 压缩 JavaScript,使用 `OptimizeCSSAssetsPlugin` 压缩 CSS。 ### 请解释什么是响应式设计,并列举其实现方式 响应式设计是一种网页布局方法,确保网站在不同设备上都能良好显示。主要实现方式包括: - **媒体查询(Media Queries)**:根据设备的屏幕尺寸、分辨率等参数应用不同的 CSS 样式。 - **弹性布局(Flexbox)与网格布局(Grid)**:使用 CSS Flexbox 或 Grid 实现灵活的容器布局,适应不同屏幕。 - **百分比宽度与视口单位**:使用相对单位如 `%`、`vw`、`vh` 来定义元素尺寸。 - **图片自适应**:设置 `img { max-width: 100%; }` 确保图片随容器缩放;结合 `<picture>` 元素和 `srcset` 提供多分辨率图片源。 - **移动优先策略**:优先为移动端编写样式,再通过媒体查询扩展至大屏设备。 ### 什么是服务端渲染(SSR)?它与客户端渲染(CSR)有何区别? 服务端渲染(Server-Side Rendering, SSR)是指在服务器端生成 HTML 内容并返回给浏览器,用户可立即看到完整的页面内容,适用于 SEO 和首屏加载优化。代表技术有 Next.js(React)、Nuxt.js(Vue)等。 客户端渲染(Client-Side Rendering, CSR)则是在浏览器中通过 JavaScript 动态生成页面内容,适合交互丰富的单页应用(SPA),但不利于搜索引擎抓取且首屏加载时间较长。 两者的区别主要体现在页面生成时机、SEO 支持、性能表现等方面。 ### 如何防范 XSS 攻击? XSS(跨站脚本攻击)是通过注入恶意脚本执行于用户浏览器的一种攻击方式。防范措施包括: - 对用户输入进行转义,避免直接插入 HTML。 - 使用 CSP(内容安全策略)限制外部脚本的执行。 - 设置 Cookie 属性为 `HttpOnly` 防止 JavaScript 访问敏感 Cookie。 - 使用前端框架内置的安全机制,如 React 的 JSX 自动转义、Angular 的 DomSanitizer 等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值