在 JavaScript 中,Array.slice() 和 Array().slice() 都是用来获取数组的子集。然而,它们有些微妙的差别,在使用时需要注意。
Array.slice()
Array.slice() 是 Array.prototype 上的一个方法,用于返回一个新的数组,该数组包含原始数组中从开始索引(包括)到结束索引(不包括)之间的元素。如果省略第二个参数,则默认为数组长度。
const arr = [1, 2, 3, 4, 5]; const slicedArr = arr.slice(1, 4); console.log(slicedArr); // [2, 3, 4]
Array().slice()
另一方面,Array() 是 JavaScript 中内置的构造函数之一。当以这种方式调用它时,它会创建一个新的空数组对象。然后,我们可以使用 slice() 方法从该对象上获取一个子集。
const arr = [1, 2, 3, 4, 5]; const slicedArr = Array().slice.call(arr, 1, 4); console.log(slicedArr); // [2, 3, 4]
在这个例子中,我们使用了 Function.prototype.call() 方法来调用 slice() 方法,并在第一个参数中传入目标数组。这允许我们绕过了 Array.prototype 上的直接调用,并通过一个空的数组对象来调用 slice()。
区别与建议
虽然这两种方式都可以获取数组的子集,但是它们在一些方面有所不同。最明显的区别可能在于,当原始数组不是一个真正的数组时,Array.slice() 方法将会失败(比如 DOM 集合或 arguments 对象)。而使用 Array().slice() 可以避免这个问题。
此外,由于 Array.slice() 是直接在数组对象上调用的,因此效率可能会更高一些。然而,在大多数情况下,这种性能差异是微不足道的。
当然,对于大多数开发者而言,Array.slice() 也更加简洁和易于理解。因此,我们建议尽量使用 Array.slice() 来获取数组的子集,除非在特殊情况下需要使用 Array().slice()。
// 推荐使用 Array.slice() const arr = [1, 2, 3, 4, 5]; const slicedArr = arr.slice(1, 4); console.log(slicedArr); // [2, 3, 4]
// 特殊情况下可以考虑使用 Array().slice() const arr = [1, 2, 3, 4, 5]; const slicedArr = Array().slice.call(arr, 1, 4); console.log(slicedArr); // [2, 3, 4]
总之,在掌握了这两种方式之后,我们可以更加灵活地操作数组,并且能够更好地处理各种情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/30668