前端高频面试题day3
JavaScript作用域理解
核心概念
- 作用域:定义变量/函数的可见范围及生命周期,分为 全局作用域、函数作用域、块级作用域。
- 作用域链:变量查找从当前作用域逐级向上直至全局,遵循词法作用域(静态作用域)。
- 闭包:函数能访问并保留其声明时的外部变量,即使外部作用域已销毁。
作用域类型
1. 全局作用域
- 定义:在函数/代码块外声明的变量。
- 特点:全局有效,易污染全局命名空间(如
window
对象属性)。
2. 函数作用域
- 定义:函数内部声明的变量。
- 特点:
- 函数内部有效,外部不可访问。
var
声明的变量具有函数作用域,存在变量提升。
3. 块级作用域(ES6新增)
- 定义:由
{}
包裹的代码块(如if
、for
、while
)。 - 特点:
let
/const
声明的变量仅在块内有效,避免变量泄漏。- 解决
var
的块级作用域缺陷。
var
、let
、const
的区别
特性 | var | let/const |
---|---|---|
作用域 | 函数作用域 | 块级作用域 |
变量提升 | 声明提升,赋值不提升(初始值为 undefined ) | 声明提升,但处于“暂时性死区”(TDZ) |
重复声明 | 允许重复声明 | 禁止重复声明 |
可变性 | 可重新赋值 | let 可变,const 不可变 |
全局属性 | 全局变量成为 window 的属性 | 不成为 window 的属性 |
初始化 | 允许未初始化(var a; ) | const 必须初始化 |
let
全局变量能否通过 window
访问?
- 答案:不能。
- 原因:
- ES6 后,
let
/const
声明的全局变量不挂载到全局对象(如window
)。 - 仅
var
声明的全局变量会成为window
的属性。
- ES6 后,
Object.keys()
返回值是否有序?
- 规范:未强制保证顺序,但现代引擎通常遵循:
- 非数字键按插入顺序排列。
- 数字键按升序排列(如
"1"
在"2"
之前)。
- 建议:不可依赖顺序,需显式排序。
Fetch API 的优缺点
优点
- 基于 Promise:支持
async/await
,代码简洁。 - 流式处理:可逐步读取大文件或实时数据。
- 灵活配置:支持自定义方法、头信息、请求体等。
缺点
- 默认不发送 Cookies:需
credentials: 'include'
。 - 兼容性问题:不支持 IE 等旧浏览器。
- 错误处理需手动干预:需检查
response.ok
。
BigInt
与 Number
的区别
特性 | Number | BigInt |
---|---|---|
数据类型 | 双精度浮点数(IEEE 754) | 任意精度整数 |
范围 | 安全整数范围:±(2^53 -1) | 无限制,可表示任意长度整数 |
语法 | 直接书写(如 42 ) | 后缀 n (如 42n )或 BigInt() |
运算规则 | 支持浮点运算及特殊值(如 NaN ) | 仅整数运算,不能与 Number 直接混合 |
应用场景 | 通用数值计算 | 处理超大整数(如加密、金融计算) |
尾调用(Tail Call)
- 定义:函数的最后一步操作是调用另一个函数(包括自身),且返回值直接传递。
- 好处:
- 避免栈溢出:通过尾调用优化(TCO)复用栈帧。
- 节省内存:无需保留当前函数的执行上下文。
- 优化递归:将深度递归转化为迭代式执行。
ES6 新特性(精选)
- 块级作用域:
let
/const
解决var
的变量提升问题。 - 箭头函数:简化语法,无
this
绑定。 - 类与继承:
class
/extends
糖语法。 - 解构赋值:
const [a, b] = arr;
。 - 模板字符串:反引号支持多行和插值。
- Promise:标准化异步编程。
- Map/Set:更高效的数据结构。
- 扩展运算符:
[...arr]
展开数组。 - 默认参数:
function(a=1) {}
。 - Symbol:唯一且不可变的标识符。
箭头函数能否作为构造函数?
- 答案:不能。
- 原因:
- 箭头函数无
[[Construct]]
内部方法,无法通过new
实例化。 - 无
this
绑定能力,继承外层this
,无法创建新对象。
- 箭头函数无
箭头函数 vs 普通函数
特性 | 普通函数 | 箭头函数 |
---|---|---|
this 绑定 | 动态绑定(调用上下文决定) | 词法绑定(继承外层 this ) |
语法 | 需 function 关键字 | 简写 => ,省略 return |
构造函数 | 可通过 new 实例化 | 不能作为构造函数 |
arguments | 内置 arguments 对象 | 无,需用 ...args 替代 |
super | 支持(类中调用父类) | 不支持 |
函数提升 | 支持(声明前可调用) | 不支持(必须先声明) |