JavaScript数组unshift()方法详解与性能优化

作者:寒星时间:2026-10-31 09:32:54浏览:667

本文详解JavaScript中unshift()方法向数组头部添加元素的用法,并深入分析其性能瓶颈。通过对比手写unshift、push结合reverse以及直接unshift三种实现方式,展示在大规模数据操作下,利用push添加元素后reverse反转数组可显著提升执行效率,为前端开发提供实用的性能优化建议。

JavaScript数组中如何使用unshift()方法

该方法用于将新元素插入到数组的起始位置

示例

具体操作是将新项添加到数组的起始位置

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon","Pineapple");

执行后,fruits数组的内容将输出为:

Lemon,Pineapple,Banana,Orange,Apple,Mango

定义与用法

unshift()方法允许向数组开头添加一个或多个元素,并返回数组的新长度

需要注意的是,该方法会直接修改原数组的长度和结构

提示:若需将新元素添加到数组末尾,建议使用push()方法

JavaScript中unshift方法的性能分析

js的unshift()方法能够向数组头部添加元素并返回新的数组长度,下面我们来手动实现一个unshift()方法

Array.prototype._unshift = function () {
        let arr = this
        let oldLen = this.length
        let argLen =  arguments.length
        let newLen = oldLen + argLen
        for (let i = oldLen - 1; i >= 0; i--) {
            arr[i + argLen] = arr[i]
        }
        for (let i = 0; i < argLen; i++) {
            arr[i] = arguments[i]
        }
        return newLen
    }
    let arr1 = [1, 3, 4, 5, 6]
    console.log(arr1._unshift(7, 8, 1),arr1); // 8, [7, 8, 1, 1, 3, 4, 5, 6]

从上述代码逻辑可以看出,该实现先将原有元素向后移动,再插入新元素,因此在数组长度较大的情况下,这种操作的性能表现较差

然而,我们可以采用先执行push()添加元素,再调用reverse()反转数组的策略,这样效率会更高

接下来我们手动实现push和reverse方法来进行对比测试

 Array.prototype._push = function () {
        let arr = this
        let len = arguments.length
        for(let i = 0; i < len; i++) {
            this[this.length] = arguments[i]
        }
        return this.length
    }
    let arr = [2, 54, 65, 3, 4]
Array.prototype._reverse = function () {
        let arr = this
        let j = arr.length - 1
        for(let i = 0; i < j; i++,j--) {
            let curLeft = arr[i]
            let curRight = arr[j]
            arr[i] = curRight
            arr[j] = curLeft
        }
        return arr
    }

可以看出reverse和push的时间复杂度要低。实际对比下

 let arr = []
 console.time('time1')
 for(let i = 0 ;i< 10000; i++) {
     arr.unshift(i)
 }
 console.timeEnd('time1')   // 平均耗时 5ms
    let arr = []
    console.time('time2')
    for(let j = 0 ;j< 10000; j++) {
       arr.push(j)
    }
    arr.reverse()
    console.timeEnd('time2')  // 平均耗时 0.47ms

归纳

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站

作者最新文章