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

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;技术分享 文章被收录于专栏

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

全部评论

相关推荐

昨天 21:41
已编辑
湘潭大学 前端工程师
四月份总的目标是:算法方面&nbsp;力扣hot100刷50道八股方面&nbsp;每天背&nbsp;没有具体目标项目方面&nbsp;继续写完ai对话项目&nbsp;第二个写一个rtc音视频项目总得来说就是补完简历里面所有还不具备的能力&nbsp;(附上终极版简历3.30背了一些很基础的八股&nbsp;比如vue2与vue3区别&nbsp;computed和watch区别&nbsp;URL输入到页面显示的具体流程等等(看牛客面筋发现怎么那么难啊&nbsp;和自己背的完全不是一个水平😅&nbsp;看来远远不够哇)力扣写了两个简单题完善了终极版简历(后面也会修修补补吧)好累啊感觉😭&nbsp;特别是柠檬的累了一天打算躺床上刷抖音休息&nbsp;迎面走来的是“前端已死”“ai取代前端”“前端大裁员”😇😇😇3.31今天不在状态&nbsp;脑袋很昏&nbsp;就没写算法也没写项目一直背八股背着背着找到了高中的感觉&nbsp;那时候也是用平板边听歌边背英语生物啥的&nbsp;和今天一样。看了看时间&nbsp;好像也只有两个多月又要高考了&nbsp;…怎么说呢&nbsp;很怀念吧&nbsp;那时候有坚定的目标&nbsp;有志同道合的朋友&nbsp;一起为了高考努力&nbsp;周末打打篮球&nbsp;看看动漫啥的&nbsp;很纯粹的情感&nbsp;记得那时候会因为放月假&nbsp;前一天晚上整个男寝不睡觉串寝吃东西玩游戏聊天啥的&nbsp;遇见的人都很纯粹&nbsp;很单纯&nbsp;很有趣的日子不禁想起现在与未来总感觉身边的人都变得成熟&nbsp;也不再那么单纯&nbsp;自己也再也没有那时候坚定乐观的那种心境了&nbsp;还是很怀念啊&nbsp;即使才过了一年不到&nbsp;未来还会遇到纯粹的人吗&nbsp;未来还会保持豁达自信的心境吗&nbsp;未来还会有这种单纯有趣的日子吗……唉…😮‍💨
点赞 评论 收藏
分享
昨天 00:39
门头沟学院 C++
点赞 评论 收藏
分享
评论
4
7
分享

创作者周榜

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