当前位置: 首页 > news >正文

前端高频面试题day3

JavaScript作用域理解

核心概念

  • 作用域:定义变量/函数的可见范围及生命周期,分为 全局作用域函数作用域块级作用域
  • 作用域链:变量查找从当前作用域逐级向上直至全局,遵循词法作用域(静态作用域)。
  • 闭包:函数能访问并保留其声明时的外部变量,即使外部作用域已销毁。

作用域类型

1. 全局作用域

  • 定义:在函数/代码块外声明的变量。
  • 特点:全局有效,易污染全局命名空间(如 window 对象属性)。

2. 函数作用域

  • 定义:函数内部声明的变量。
  • 特点
    • 函数内部有效,外部不可访问。
    • var 声明的变量具有函数作用域,存在变量提升。

3. 块级作用域(ES6新增)

  • 定义:由 {} 包裹的代码块(如 ifforwhile)。
  • 特点
    • let/const 声明的变量仅在块内有效,避免变量泄漏。
    • 解决 var 的块级作用域缺陷。

varletconst 的区别

特性varlet/const
作用域函数作用域块级作用域
变量提升声明提升,赋值不提升(初始值为 undefined声明提升,但处于“暂时性死区”(TDZ)
重复声明允许重复声明禁止重复声明
可变性可重新赋值let 可变,const 不可变
全局属性全局变量成为 window 的属性不成为 window 的属性
初始化允许未初始化(var a;const 必须初始化

let 全局变量能否通过 window 访问?

  • 答案不能
  • 原因
    • ES6 后,let/const 声明的全局变量不挂载到全局对象(如 window)。
    • var 声明的全局变量会成为 window 的属性。

Object.keys() 返回值是否有序?

  • 规范:未强制保证顺序,但现代引擎通常遵循:
    • 非数字键按插入顺序排列。
    • 数字键按升序排列(如 "1""2" 之前)。
  • 建议不可依赖顺序,需显式排序。

Fetch API 的优缺点

优点

  • 基于 Promise:支持 async/await,代码简洁。
  • 流式处理:可逐步读取大文件或实时数据。
  • 灵活配置:支持自定义方法、头信息、请求体等。

缺点

  • 默认不发送 Cookies:需 credentials: 'include'
  • 兼容性问题:不支持 IE 等旧浏览器。
  • 错误处理需手动干预:需检查 response.ok

BigIntNumber 的区别

特性NumberBigInt
数据类型双精度浮点数(IEEE 754)任意精度整数
范围安全整数范围:±(2^53 -1)无限制,可表示任意长度整数
语法直接书写(如 42后缀 n(如 42n)或 BigInt()
运算规则支持浮点运算及特殊值(如 NaN仅整数运算,不能与 Number 直接混合
应用场景通用数值计算处理超大整数(如加密、金融计算)

尾调用(Tail Call)

  • 定义:函数的最后一步操作是调用另一个函数(包括自身),且返回值直接传递。
  • 好处
    • 避免栈溢出:通过尾调用优化(TCO)复用栈帧。
    • 节省内存:无需保留当前函数的执行上下文。
    • 优化递归:将深度递归转化为迭代式执行。

ES6 新特性(精选)

  1. 块级作用域let/const 解决 var 的变量提升问题。
  2. 箭头函数:简化语法,无 this 绑定。
  3. 类与继承class/extends 糖语法。
  4. 解构赋值const [a, b] = arr;
  5. 模板字符串:反引号支持多行和插值。
  6. Promise:标准化异步编程。
  7. Map/Set:更高效的数据结构。
  8. 扩展运算符[...arr] 展开数组。
  9. 默认参数function(a=1) {}
  10. Symbol:唯一且不可变的标识符。

箭头函数能否作为构造函数?

  • 答案不能
  • 原因
    • 箭头函数无 [[Construct]] 内部方法,无法通过 new 实例化。
    • this 绑定能力,继承外层 this,无法创建新对象。

箭头函数 vs 普通函数

特性普通函数箭头函数
this 绑定动态绑定(调用上下文决定)词法绑定(继承外层 this
语法function 关键字简写 =>,省略 return
构造函数可通过 new 实例化不能作为构造函数
arguments内置 arguments 对象无,需用 ...args 替代
super支持(类中调用父类)不支持
函数提升支持(声明前可调用)不支持(必须先声明)

相关文章:

  • 【项目中的流程管理(十)】
  • 深入理解 Linux 用户管理:从基础到实践
  • 基于STM32、HAL库的HX711模数转换器ADC驱动程序设计
  • MIME 类型是个什么东西?
  • setup和hold互卡问题剖析
  • CDA Edit 的设计
  • vscode本地化显示远程图形化界面
  • 生成式人工智能认证(GAI认证)有什么用?
  • 谷歌提示词工程白皮书 第一部分
  • 从零构建云原生秒杀系统——后端架构与实战
  • disruptor-spring-boot-start版本优化升级
  • 【前端】jQuery 对数据进行正序排列
  • 仿微信上传头像,实现拍摄、相册选择、手动缩放、裁剪、蒙版、撤回、还原、上传微信本地文件功能
  • 使用Open Compass进行模型评估,完成AI模型选择
  • DeepSeek接入企业知识库,如何识别手写文档与扫描件?
  • pikachu靶场-敏感信息泄露
  • mac 设置飞书默认浏览器(解决系统设置默认浏览器无效)
  • 土壤有机质含量
  • 使用 Doxygen 生成类似官网的专业文档
  • ESP32-S3 入门学习笔记(四):LED实验
  • 上海“生育友好岗”已让4000余人受益,今年将推产假社保补贴政策
  • 第二十届中国电影华表奖揭晓!完整获奖名单来了
  • 中国航天员乘组完成在轨交接,神十九乘组将于29日返回地球
  • 日均新开三家“首店”,上海的“首发经济”密码是什么?
  • 金正恩出席朝鲜人民军海军驱逐舰入水仪式
  • 龚曙光:散文家永远只有一个视角,就是“我与时代”