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

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

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

全部评论

相关推荐

我是腾讯26年的校招生,从去年8月开始我入职腾讯CDG某部门实习,因为目标就是转正,从进去第一天开始,我就是按全职的标准在干活的,一个人负责一个独立模块,整个8月到11月,我一个月最多请一天假,除了真的有考试,几乎天天都在,所有课余时间都奉献给了公司。在整个过程里,领导对我的评价一直很正面,甚至跟我说过,这里会是一个很好的起点。我当时其实手里不止腾讯一个选择,还有好几家好头部大厂和外企给了面试,有的已经到终面,有的已经拿到offer,有些薪资比腾讯还高。但我信任腾讯,觉得一个大厂不会对认认真真干了这么久得到转正的实习生做出撕offer的事。所以我签了腾讯的转正offer,其他的全部婉拒签完之后我的工作量没有任何变化,还照常推项目,甚至一直到被毁约前一周,我收到的是工作上的正面反馈。但就直到上周,我还在项目上工作,就在不久之前还在得到+1对工作质量的认可,在没有任何征兆的情况下,就突然得到HR的通知,说因为部门HC的原因,我的Offer会被撤回,我需要马上签字,不然就会被强行解约。面对这个情况,我至今想不通第一,部门并无大规模变动,同届校招生无一受影响,为何偏偏只对我一个海外院校学生没有三方协议的应届生下手?是不是因为我身份特殊、维权更难,就成了可以随意牺牲的软柿子?第二,腾讯是否算过我付出的巨大机会成本?我从大一就开始实习,辗转各个大厂和知名企业,牺牲了大量课余时间,前前后后做了至少7-8份实习,就是为了毕业能有一份工作。终于拿到腾讯的转正offer,我以为可以安心了。结果呢?春招已经过了大半,我对口的岗位招聘接近尾声,我现在面临的是毕业即失业,甚至可能要延长学业。区区几个月的实习薪水补偿,能弥补我错失的全部机会吗?能弥补这几个月的心血和精神上的打击吗?难道作为头部企业的腾讯,毁约一个校招生的offer就这么随便?我不知道怎么面对父母,怎么面对朋友,怎么面对努力了整整一个学生生涯的的自己!收到毁约通知当天,我在小红书如实发布经历,帖子迅速获得热度,但仅仅几个小时过后,却在无任何违规通知、账号显示正常的情况下,被悄无声息限流屏蔽——只有我自己能看见,外人完全无法点开,后续相关内容也全部被限制流量。我只是一个普通应届生,只是想说出自己的真实遭遇,腾讯到底动用了何种手段,让一个讲述事实的声音被如此压制?我为我的陈述承担一切法律责任收起
饿魔:鹅现在这么逆天了?
点赞 评论 收藏
分享
今天 00:39
门头沟学院 C++
点赞 评论 收藏
分享
评论
4
6
分享

创作者周榜

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