推荐使用字面量[]创建数组,如const arr = [1, 2, 3];new Array(5)创建空数组而非含5个undefined的数组,Array.from()或展开运算符更安全替代slice.call();push/pop/shift/unshift/splice/sort/reverse会改变原数组;filter返回满足条件的新数组,map返回等长新数组,find返回首个匹配项;includes()能正确识别NaN,indexOf()不能。

JavaScript数组创建很简单,但不同方式会影响后续操作的灵活性;常用方法里有些会改原数组、有些不会,用错容易引发隐蔽 bug。
怎么创建数组才不容易踩坑
创建数组有字面量、构造函数两种主流方式,但构造函数在传单个数字时行为反直觉:
-
[]最安全,推荐日常使用,比如const arr = [1, 2, 3] -
new Array(5)不是创建含 5 个undefined的数组,而是创建长度为 5 的空数组(arr[0]是undefined,但arr.hasOwnProperty(0)为false) -
new Array(1, 2, 3)才等价于[1, 2, 3],参数个数决定行为,容易误判 - 从类数组对象转数组,别直接用
Array.prototype.slice.call()(已过时),改用Array.from()或展开运算符[...arguments]
哪些数组方法会改变原数组
这类方法执行后原数组内容就变了,如果数据被多处引用,可能引发意料外的状态污染:
-
push()、pop()、shift()、unshift():增删首尾元素 -
splice():万能修改,可删、可插、可替,第一个参数是起始索引,第二个是删除个数,之后全是插入项 -
sort():默认按字符串 Unicode 码点排序,[10, 2, 30].sort()得到[10, 2, 30]而不是[2, 10, 30],务必传比较函数:(a, b) => a - b -
reverse():反转,不返回新数组
filter/map/find 之间到底怎么选
这三个都遍历、都不改原数组,但语义和返回值完全不同,混用会导致逻辑错误:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“Java免费学习笔记(深入)”;
-
filter()返回满足条件的**新数组**,长度 ≤ 原数组,例如[1,2,3].filter(x => x > 1)→[2, 3] -
map()返回**等长新数组**,每个元素是回调返回值,哪怕返回undefined也会占位 -
find()只返回**第一个匹配项**(或undefined),不是数组,适合“找一个就停”的场景;要找所有匹配项,必须用filter() - 注意
findIndex()和indexOf()区别:前者支持函数判断,后者只支持严格相等
includes() 和 indexOf() 判定 NaN 的差异
这是容易被忽略的兼容性细节:ES6 的 includes() 能正确识别 NaN,而 indexOf() 不能:
const arr = [1, NaN, 3]; arr.indexOf(NaN); // -1(错误!) arr.includes(NaN); // true(正确)
includes() 内部用的是 SameValueZero 比较算法,对 NaN 和 0 的处理更符合直觉;但要注意它不支持回调函数,只能做值匹配。









