参照 ecma262 草案的规定,关于 push 和 pop 的规范如下图所示:

    1.jpg

    2.jpg

    首先来实现一下 push 方法:

    1. Array.prototype.push = function(...items) {
    2. let O = Object(this);
    3. let len = this.length >>> 0;
    4. let argCount = items.length >>> 0;
    5. // 2 ** 53 - 1 为JS能表示的最大正整数
    6. if (len + argCount > 2 ** 53 - 1) {
    7. throw new TypeError("The number of array is over the max value restricted!")
    8. }
    9. for(let i = 0; i < argCount; i++) {
    10. O[len + i] = items[i];
    11. }
    12. let newLength = len + argCount;
    13. O.length = newLength;
    14. return newLength;
    15. }

    亲测已通过MDN上所有测试用例。MDN链接

    然后来实现 pop 方法:

    1. Array.prototype.pop = function() {
    2. let O = Object(this);
    3. let len = this.length >>> 0;
    4. if (len === 0) {
    5. O.length = 0;
    6. return undefined;
    7. }
    8. len --;
    9. let value = O[len];
    10. delete O[len];
    11. O.length = len;
    12. return value;
    13. }

    亲测已通过MDN上所有测试用例。MDN链接

    参考链接:

    V8数组源码

    ecma262规范草案

    MDN文档

    三元博客