昨天学弟去某公司面试实习,回来讲竟然被一些基础题给绊了脚,幸亏本身慢慢回忆起来,没有致使太尴尬的局面。其中有一题就是问:js数组操做中,有哪些会影响到数组自己?哪些不会影响?分别举例说明。其实这个问题咱们平时都能接触到不少,项目中处处都有数组,追加、截取、替换、遍历不少,但是忽然被问起这种问题可能还会心中咯噔一下,因此咱们今天就来好好梳理一下,js数组操做中的几个容易忽略的知识点。面试
1.建立数组的三种方法数组
(1)建立定长空数组:初始化一个长度为10的空数组浏览器
// 语法: var arr = new Array(len)
var arr = new Array(10); // 建立一个长度为10的空数组,每一项都为undefined复制代码
(2)建立一个包含有数据的数组:每一项都被初始化了赋值了bash
// 语法: var cols = new Array(data1,data2,……)
// 数组中的数据类型能够不一样,可是通常建立一个数组建议是同一类数据
var arr = new Array(1, 'a', 'hello', true);复制代码
(3)简单语法糖函数
var arr = []; // 建立一个空数组,长度为0复制代码
2.数组的操做ui
(1)遍历spa
for循环:3d
for(var i=0; i<arr.length; i++){
console.log(arr[i]);
}复制代码
map:code
打标记:返回一个新的数组,不影响原来的数组cdn
(2)push/pop末尾追加/删除
打标记:修改的是原数组
push():追加不会去重,返回值是追加后的数组长度
pop():删除数组最后一个元素,返回值是被删除的那个元素
(3)unshift/shift
打标记:修改的是原数组
(4)join:
用于把数组中的全部元素放入一个字符串,元素是经过指定的分隔符进行分隔的,若是不指定,则默认为逗号(',')
打标记:获得一个新的字符串,不修改原来的数组
(5)reverse:反排序
打标记:影响原来的数组
(6)sort排序:对数组中元素进行排序 arrayObject.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
打标记:会修改原来的数组
(10)其余
length:返回数组长度
indexOf():从数组的指定位置开始向后查找,第一个命中值所在的位置
// 语法: arrayObject.indexOf(searchValue, startIndex)复制代码
这种查询方法和属性都不会影响数组自己
总结:经过上面的整理,咱们应该能很清晰地知道,map、join、concat、slice这些方法在操做数组的时候是返回一个新的对象,而不会影响到被操做的数组自己。而push、pop、shift、unshift、reverse、sort、splice这种增删改性质的方法会直接修改数组自己,因此在项目中进行这一类数组操做的时候须要特别注意,防止一处修改,致使其余引用的异常。
附:感谢您的阅读,也但愿对您有所帮助。同时若是以上内容中存在疑问和错误,欢迎留言或者私信。