小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
前言
今天遇到一枚手写题,如下:
// JS-笔试题 数组元素位置循环左右移动
function move(arr, n) {
// TODO
}
var arr = [0, 1, 2, 3, 4, 5];
console.log(move(arr, -2)); // [1, 2, 3, 4, 5, 0]
console.log(move(arr, -1)); // [2, 3, 4, 5, 0, 1]
console.log(move(arr, 1)); // [5, 0, 1, 2, 3, 4]
console.log(move(arr, 2)); // [4, 5, 0, 1, 2, 3]
console.log(move(arr, 3)); // [3, 4, 5, 0, 1, 2]
脑海中瞬间闪现,slice、splice、pop、shift... 然后下手尝试,终以
function move(arr, n) {
let newArr = [
...arr.slice(-n, arr.length),
...arr.slice(0, n > 0 ? arr.length - n : -n),
];
return newArr;
}
得以解决。 顺手翻阅了一下slice的MDN
slice
方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组 还有这操作?那我们一般都如何去创建数组呢?
构造函数创建
new Array(3)
数组字面量创建
const names = ['Grey','Shelly','John']
要注意的是,与对象一样,在使用数组字面量表示法创建数组时不会调用Array构造函数
静态方法创建
这里有两种方式
- Array.from()
从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
//当输入第二个参数时,可对现有数组进行增强
Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]
- Array.of()
创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
它的兼容就环境一栏赫然写着:
if (!Array.of) {
Array.of = function() {
return Array.prototype.slice.call(arguments);
};
}
原来这是slice其中一个用法的平替。