昨天学弟去某公司面试实习,回来说居然被一些基础题给绊了脚,幸好自己慢慢回忆起来,没有导致太尴尬的局面。其中有一题就是问:js数组操作中,有哪些会影响到数组本身?哪些不会影响?分别举例说明。其实这个问题我们平时都能接触到很多,项目中到处都有数组,追加、截取、替换、遍历很多,可是突然被问起这种问题可能还会心中咯噔一下,所以我们今天就来好好梳理一下,js数组操作中的几个容易忽略的知识点。
1.创建数组的三种方法
(1)创建定长空数组:初始化一个长度为10的空数组
// 语法: var arr = new Array(len)
var arr = new Array(10); // 创建一个长度为10的空数组,每一项都为undefined(2)创建一个包含有数据的数组:每一项都被初始化了赋值了
// 语法: var cols = new Array(data1,data2,……)
// 数组中的数据类型可以不同,但是一般创建一个数组建议是同一类数据
var arr = new Array(1, 'a', 'hello', true);(3)简单语法糖
var arr = []; // 创建一个空数组,长度为02.数组的操作
(1)遍历
for循环:
for(var i=0; i<arr.length; i++){
console.log(arr[i]);
}map:
打标记:返回一个新的数组,不影响原来的数组

(2)push/pop末尾追加/删除
打标记:修改的是原数组
push():追加不会去重,返回值是追加后的数组长度
pop():删除数组最后一个元素,返回值是被删除的那个元素

(3)unshift/shift
打标记:修改的是原数组

(4)join:
用于把数组中的所有元素放入一个字符串,元素是通过指定的分隔符进行分隔的,如果不指定,则默认为逗号(',')
打标记:得到一个新的字符串,不修改原来的数组

(5)reverse:反排序
打标记:影响原来的数组

(6)sort排序:对数组中元素进行排序 arrayObject.sort(sortBy)
打标记:影响原来的数组
- 即使数组中的每一项都是数值,sort()方法比较的也是字符串sort()
- 方法可以接受一个比较函数作为参数
- sortBy必须是函数

降序排列(升序排列同理):
var arr=[1,5,8,2,-3,20,15];
// 降序
arr.sort(function(a,b){console.log(a,b); return b-a})
我特意把每次比较的数据打印出来,不难看出,这是符合冒泡排序的,两两比较,true则换位,继续和前一个比较,直到顶部,然后下一个值开始进行第二轮比较。
(7)concat:用于连接两个或多个数组
打标记:返回一个新的数组,不影响原来的数组,同时不会去重

附加:如果需要去重,ES5可以利用for循环,ES6可以运用拓展运算符、
数组的from和set方法进行处理,具体from(),set用法就在这里不赘述了,代码如下:

(8)slice:从已有数组中返回选定的元素
打标记:返回一个新的数组,不影响原来的数组
// 语法 arrayObject.slice(start, end);w3c中说明start是必填项,但是实际上slice()中如果不填写参数的话,也能正常返回结果,返回的是数组本身。

(9)splice
打标记:会修改原来的数组
- 删除:arrayObject.splice(index, count); 删除从index开始的0个或多个元素,返回值是被删除的元素的数组
- 插入:arrayObject.splice(index, 0, item1,……,itemX) 在指定的位置插入值,index:起始位置,0:要删除的项数,item1……itemX:要插入的项
- 替换:arrayObject.splice(index,count,item1,……,itemX); 指定位置插入值,同时删除任意数量的项

(10)其他
length:返回数组长度
indexOf():从数组的指定位置开始向后查找,第一个命中值所在的位置
// 语法: arrayObject.indexOf(searchValue, startIndex)这种查询方法和属性都不会影响数组本身
总结:通过上面的整理,我们应该能很清晰地知道,map、join、concat、slice这些方法在操作数组的时候是返回一个新的对象,而不会影响到被操作的数组本身。而push、pop、shift、unshift、reverse、sort、splice这种增删改性质的方法会直接修改数组本身,所以在项目中进行这一类数组操作的时候需要特别注意,防止一处修改,导致其他引用的异常。
附:感谢您的阅读,也希望对您有所帮助。同时如果以上内容中存在疑问和错误,欢迎留言或者私信。