前言:JS 完整学习两条主线
底层原理篇:作用域、闭包、原型链、执行上下文、事件循环、this、异步、垃圾回收(面试深挖原理、看执行逻辑)
基础应用篇(本文) :内置API、数组/字符串/对象操作、遍历语法、数据结构、类型转换、深浅拷贝(笔试、项目、初级面试必考)
学习建议:基础API是一切的基石,先会用,再懂原理,面试才能做到无死角。
温馨提示:本文适合面试前突击、查漏补缺、系统梳理JS基础工具语法,全覆盖前端常用基础考点。
一、数组 全套高频API(面试 / 笔试 / 项目核心)
1.1 会改变原数组的方法(必背考点)
记忆口诀:增删改、反转、排序,全部改动原数组
- push() :数组尾部追加元素,返回新数组长度
- pop() :删除数组最后一项,返回被删除的元素
- unshift() :数组头部添加元素,返回新数组长度
- shift() :删除数组第一项,返回被删除的元素
- splice(起始下标, 删除个数, 新增内容) :数组万能方法,可增、可删、可改
- reverse() :数组反转,直接改变原数组
- sort() :数组排序,默认字典排序,数字排序需要手动写回调函数
1.2 不会改变原数组的方法(返回新值/新数组)
这类方法支持链式调用,项目开发最常用,无副作用
- slice(start, end) :截取数组,不包含结束下标,可用于数组浅拷贝
- concat() :数组拼接,合并多个数组
- join('分隔符') :数组转字符串
- map() :映射遍历,一一对应返回新数组,支持链式调用
- filter() :条件过滤,返回符合条件的新数组
- reduce() :累加器,可实现求和、去重、统计、数组扁平化,万能迭代方法
- forEach() :纯遍历,无返回值,不支持中断
- find() :查找第一个符合条件的元素,找不到返回 undefined
- findIndex() :查找第一个符合条件元素的下标,找不到返回 -1
- every() :全部元素满足条件才返回 true,否则 false
- some() :任意一个元素满足条件就返回 true
- includes() :判断数组是否包含某元素,返回布尔值
1.3 数组面试高频问答
Q1:slice 和 splice 的核心区别?
slice 是截取方法,不改变原数组,常用于浅拷贝;splice 是增删改方法,直接修改原数组。
Q2:map 和 forEach 的区别?
map 有返回值,生成新数组,支持链式调用;forEach 无返回值,仅做单纯遍历。
二、字符串 常用核心API
字符串所有操作不会改变原字符串,只会返回新字符串
- charAt(index) :获取指定下标的字符
- substr(起始位置, 截取长度) :按长度截取
- substring(起始, 结束) :按下标区间截取
- slice() :字符串截取,支持负数参数
- split('分隔符') :字符串转数组,项目超级常用
- toUpperCase() / toLowerCase() :大小写转换
- trim() :去除首尾空格
- includes() :判断是否包含指定字符
- startsWith() / endsWith() :判断开头、结尾是否匹配
- replace() :替换字符,可结合正则全局替换
三、Math 数学常用API(笔试算法高频)
- Math.floor() :向下取整
- Math.ceil() :向上取整
- Math.round() :四舍五入
- Math.random() :生成 0~1 随机小数
- Math.max() / Math.min() :获取最大值、最小值
- Math.abs() :取绝对值
- Math.pow(底数, 幂) :次方运算
四、对象 常用API
- Object.keys() :获取对象所有键名,返回数组
- Object.values() :获取对象所有值,返回数组
- Object.entries() :获取键值对二维数组
- Object.assign() :对象合并,属于浅拷贝
- Object.freeze() :冻结对象,无法修改、新增、删除属性
- hasOwnProperty() :判断是否为对象自身属性,不遍历原型链
五、JS 所有遍历语法(面试超级高频)
5.1 普通 for 循环
性能最优,支持 break、continue,适合遍历数组下标。
5.2 forEach 遍历
仅用于遍历,无返回值,不支持 break、continue。
5.3 for...in(重点面试题)
专门遍历 对象键名。
缺陷:会遍历原型链可枚举属性、无序、不适合遍历数组。
5.4 for...of(ES6 最优遍历)
遍历 值,支持所有可迭代对象:数组、字符串、Set、Map、伪数组。
支持 break、continue,解决 forEach 无法中断的问题。
缺点:不能遍历普通对象。
5.5 面试标准问答:for in 和 for of 区别
-
for in:遍历键名,主打对象,会遍历原型属性,不推荐数组使用;
-
for of:遍历值,主打数组/可迭代对象,支持中断,性能更好,是ES6推荐遍历方式。
六、ES6 新增数据结构 Set / Map
6.1 Set(数组去重神器)
特性:元素唯一、无序、不重复
- add():添加元素
- delete():删除元素
- has():判断元素是否存在
- clear():清空集合
- size:获取元素个数
经典用法:[...new Set(arr)] 一键数组去重
6.2 Map(灵活键值对)
普通对象 key 只能是字符串/Symbol;Map 的 key 可以是任意类型(数字、对象、数组)
- set():设置键值对
- get():获取值
- has():判断键是否存在
- delete():删除指定键值对
- clear():清空
七、深浅拷贝(基础必考)
7.1 浅拷贝
只复制第一层数据,嵌套引用类型依旧共用同一内存地址,修改会互相影响。
常用方式:扩展运算符 ...、Object.assign、数组 slice、concat
7.2 深拷贝
递归复制所有层级,彻底切断引用关系,数据完全独立。
简单方案:JSON.parse(JSON.stringify(obj))
缺陷:无法拷贝函数、undefined、Symbol,会丢失部分数据;复杂场景需要手写递归深拷贝。
八、JS 隐式类型转换(笔试大坑)
面试常考 == 比较规则
- 字符串 == 数字 → 字符串转数字再比较
- 布尔值 == 任意值 → 布尔转数字(true=1,false=0)
- null == undefined → true
- null === undefined → false
- 对象 == 基本类型 → 对象转为原始值再比较
开发规范:实际开发全部使用 === 严格相等,杜绝隐式转换带来的诡异bug。
九、文末总结
JS 基础应用层是所有前端开发的基石,重点掌握:各类API使用、是否修改原数据、遍历区别、深浅拷贝、类型转换规则。
基础层侧重会用、熟练、不踩坑,原理层侧重读懂底层、看透执行逻辑,两者结合,才算真正吃透 JavaScript。