分享三个不那么常见的字节/快手前端手撕题

1. 判断一个对象是否是 Promise(使用TypeScript)

面试写法

function isPromise<T = any>(val: any): val is Promise<T> {
  return (
    val !== null &&
    (typeof val === 'object' || typeof val === 'function') &&
    typeof val.then === 'function'
  )
}

面试讲解要点

  • 核心标准不是 instanceof Promise
  • Promise 的本质:thenable(拥有 then 方法)
  • 所以判断:

判断 Promise 本质是判断 thenable,而不是构造函数实例。

2. 写一个上传图片函数(传入 url + HTMLElement)

面试写法

function uploadImage(url: string, inputEl: HTMLInputElement) {
  const file = inputEl.files?.[0]
  if (!file) return Promise.reject('no file')

  const formData = new FormData()
  formData.append('file', file)

  return fetch(url, {
    method: 'POST',
    body: formData
  }).then(res => res.json())
}

面试讲解要点

流程拆解:

  1. 从 <input type="file"> 获取文件
  2. 使用 FormData 封装
  3. 通过 fetch / axios 发送请求

关键点:

  • input.files[0] 获取文件
  • FormData 用于文件上传(multipart/form-data)
  • 不需要手动设置 Content-Type(浏览器自动处理)

可加分点

// 限制类型
if (!file.type.startsWith('image/')) {
  throw new Error('only image allowed')
}

文件上传核心是 File + FormData + HTTP 请求。

3. "123.456" 转 number 类型

面试写法

function parseNumber(str: string): number {
  return Number(str)
}

面试讲解要点

常见三种方式:

Number("123.456")     // ✅ 推荐
parseFloat("123.456") // ✅ 可用
+"123.456"            // ✅ 简写(不推荐写在面试)

区别(简单讲就够)

  • Number():更严格(推荐)
  • parseFloat():会解析到非法字符前
parseFloat("123abc") // 123
Number("123abc")     // NaN

可加一层校验(加分)

function parseNumber(str: string): number {
  const num = Number(str)
  if (Number.isNaN(num)) {
    throw new Error('invalid number')
  }
  return num
}

Number 更严格,parseFloat 更宽松,面试优先用 Number。

附加要求:禁止直接用 Number ()/parseFloat:需做合法性校验,避免非法字符串返回NAN

/**
 * 字符串数字精确转换为number类型
 * @param numStr 数字字符串(如'123.456')
 * @returns 精确number数字,非法则返回NaN
 */
function stringToNumber(numStr: string): number {
  // 1. 空值校验
  if (!numStr || numStr.trim() === '') return NaN;

  // 2. 正则校验:仅允许数字+小数点(合法数字字符串)
  const numberReg = /^\d+(\.\d+)?$/;
  if (!numberReg.test(numStr)) return NaN;

  // 3. 精确转换为number(parseFloat保留原始小数位)
  const result = parseFloat(numStr);

  // 4. 二次校验:确保转换有效
  return isNaN(result) ? NaN : result;
}

// ------------------- 测试用例 -------------------
console.log(stringToNumber('123.456')); // 123.456 (number类型)
console.log(typeof stringToNumber('123.456')); // number
console.log(stringToNumber('abc')); // NaN(非法字符串)
console.log(stringToNumber('')); // NaN(空字符串)
console.log(stringToNumber('456')); // 456(整数兼容)

透过现象看本质

这三题本质考察的是:

  • 类型判断能力(Promise / thenable)
  • 浏览器 API 使用(File / FormData / fetch)
  • 基础数据处理(字符串转数字 & 边界处理)
#暑期实习##前端八股文##面试##日常实习##秋招#
前端面试准备&amp;技术分享 文章被收录于专栏

目前是一些前端面试相关准备文章的合集

全部评论

相关推荐

03-30 21:35
吉林大学 Java
爱蜜莉雅碳劝退测开:裁员裁大动脉了
点赞 评论 收藏
分享
自我介绍&nbsp;项目的来源项目中的难点以及解决的方法流式输出的方案的时候呢,服务端给不是你要的数据格式时候,怎么处理Markdown&nbsp;格式的话出错或者说它格式不符合你要求,你是怎么处理的?(这里详细追问了好几个问题,直到问的答不上来)虚拟列表解决的性能问题,性能问题是怎么发现的,怎么排查性能问题(详细追问,直到答不上来)项目中的登录鉴权是怎么做的?(追问)项目中最终有部署到线上吗?有没有部署到上线的项目项目完整的构建流程是怎样项目中的静态资源是怎么处理的?项目里的图片是怎么压缩的?nextTick&nbsp;的作用是什么?伪元素有什么作用?CSS&nbsp;自定义变量有什么作用?BFC&nbsp;能解决什么问题?怎样可以产生一个&nbsp;BFC?什么是暂时性死区?为什么会产生暂时性死区?用什么方式声明变量会存在暂时性死区?讲一下生成器(Generator)和迭代器(Iterator)for…in&nbsp;和&nbsp;for…of&nbsp;的区别是什么?自己写的普通对象能被&nbsp;for…of&nbsp;遍历吗?前提是什么?(没答上来)手写实现多个数组的全组合(笛卡尔积),如机型、颜色、存储全排列有效的括号(判断括号是否合法匹配)反问对前端学习的建议,这里面试官直接说他们有面评&nbsp;hr会给到(感觉有点不耐烦,不愿意回答)面试结果多久出,面试官也是说直接联系hr力竭了&nbsp;拼尽全力无法战胜&nbsp;感觉字节的面试是我面过最难受的一面
查看25道真题和解析
点赞 评论 收藏
分享
评论
4
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务