来自“阿里巴巴2017秋招前端笔试题”中的一道笔试题:
将数组 var a=[1,2,3] 变成数组 [4,3,2,1] 下面的方式正确的是?
a.reverse().unshift(4)
a.push(4).reverse()
a.push(4); a.reverse()
a.splice(3,1,4).reverse()
想要做对这道js题目,就要对数组中常用方法的作用和返回值熟悉。下面摘录一下牛客网上的一个回答:
Array对象常用方法中:
1、 concat()
连接两个或多个数组
不改变原数组
返回被连接数组的一个副本
2、join()
把数组中所有元素放入一个字符串
不改变原数组
返回字符串
3、 slice()
从已有的数组中返回选定的元素
不改变原数组
返回一个新数组
4、 toString()
把数组转为字符串
不改变原数组
返回数组的字符串形式
5、 pop()
删除数组最后一个元素,如果数组为空,则不改变数组,返回undefined
改变原数组
返回被删除的元素
6、 push()
向数组末尾添加一个或多个元素
改变原数组
返回新数组的长度
7、 reverse()
颠倒数组中元素的顺序
改变原数组
返回该数组
8、 shift()
把数组的第一个元素删除,若空数组,不进行任何操作,返回undefined
改变原数组
返回第一个元素的值
9、 sort()
对数组元素进行排序(ascii)
改变原数组
返回该数组
10、 splice()
从数组中添加/删除项目
改变原数组
返回被删除的元素
11、 unshift()
向数组的开头添加一个或多个元素
改变原数组
返回新数组的长度
A选项:a.reverse()后返回值即数组a变成[3,2,1],再使用unshift()方法在数组开头添加一个4,a数组就变成了[4,3,2,1]。注,unshift()返回新数组的长度,此处为4。正确。
B选项:push()方法返回新数组的长度,是一个number类型,不是数组,所以不能再用“.”操作符继续执行reverse()方法。错误。
C选项:正确。
D选项:splice()语法:arrayObject.splice(index,howmany,item1,…..,itemX)。
参数:
返回值:
由于a.splice(3,1,4)中的index为3,超过了数组a的下标,所以3后面的1也不会起作用。a.splice(3,1,4)会将4插入到数组a末尾。但splice()返回值是被删除项目的新数组,由于a.splice(3,1,4)并没有删除元素,所以返回的新数组为空,对空数组reverse()还是空。(如果D选项改成a.splice(3,1,4);a.reverse()就正确了。)错误。
所以正确答案为:AC。
看完了上面的解释,再看看这道题:
请问下面哪种方式可以在不改变原来数组的情况下,拷贝出数组 b ,且满足 b!=a 。例如数组 a 为 [1,2,3] 。
let b=a;
let b=a.slice();
let b=a.splice(0,0);
let b=a.concat();
你的答案是什么?
解析:
A选项 b=[1,2,3] b==a
B选项 b=[1,2,3] b!=a slice()返回一个新数组
C选项 b=[] b!=a splice(0,0)没有删除项目,因此返回空。
D选项 b=[1,2,3] b!=a concat()不改变原数组,返回被连接数组的一个副本。
所以正确答案应该是BD。