push()代码和面试题

254 阅读3分钟

push()代码

Array.prototype.push=function() {
  // 获取调用 push() 方法的数组对象
  var obj = Object(this);
  // 获取数组的长度
  var len = obj.length >>> 0;
  // 获取要添加的元素数量
  var argCount = arguments.length;
  // 循环添加元素
  for (var i = 0; i < argCount; i++) {
    // 将元素添加到数组的末尾
    obj[len + i] = arguments[i];
  }
  // 更新数组的长度
  obj.length = len + argCount;
  // 返回新的数组长度
  return obj.length;
}

解释如下:

push() 方法是一个函数,函数体内部首先获取调用该方法的数组对象,并将其存储在 obj 变量中。

获取数组的长度 len,使用位运算符 >>> 0 来确保 len 是一个非负整数。

获取要添加的元素数量 argCount,使用 arguments.length 来获取参数列表中的元素数量。

使用 for 循环,从 0 到 argCount - 1 遍历要添加的元素,将它们逐个添加到数组 obj 的末尾,即 obj[len + i] = arguments[i]

更新数组 obj 的长度,将其设置为 len + argCount

返回新的数组长度 obj.length

在上述源代码中,可以看到 push() 方法的实现过程,它主要是将新元素添加到数组末尾并更新数组的长度。如果您需要更多关于 push() 方法的详细信息,可以参考 JavaScript 的官方文档。

arguments

arguments 是一个内置的 JavaScript 对象,它表示当前函数调用时传递给该函数的参数列表。arguments 对象的特殊之处在于它是一个类数组对象,即它的属性名是数字索引,从 0 开始,并且它还有一个 length 属性,表示传递给函数的参数数量。

当函数被调用时,JavaScript 引擎会自动创建一个 arguments 对象,并将传递给该函数的所有参数都存储在 arguments 对象的属性中。这意味着,即使函数定义时没有明确指定参数,也可以通过 arguments 对象来访问传递给函数的参数值

使用push()向对象中添加元素

在 JavaScript 中,对象也可以使用 Array 原型上的 push() 方法,前提是该对象有 length 属性和数字键名。如果对象中不存在这些属性,则 push() 方法无法使用。

下面是一个示例,演示如何使用 push() 方法向对象添加元素:

let obj = {
  length: 2,
  0: "apple",
  1: "banana",
  push: Array.prototype.push,
};
 
obj.push("orange"); // 向对象 obj 中添加一个新元素 "orange"
 
console.log(obj); // {0: "apple", 1: "banana", 2: "orange", length: 3, push: ƒ}

面试题

 let obj = {
    2: 3,
    3: 4,
    length: 2,
    push: Array.prototype.push,
  };
  obj.push(1);
  obj.push(2);
  console.log(obj);

这段代码创建了一个对象 obj,它有四个属性:

2: 3,表示 obj 的第二个元素是 3
3: 4,表示 obj 的第三个元素是 4
length: 2,表示 obj 中有两个元素
push: Array.prototype.push,表示 obj 中的 push 属性是 Array 原型上的 push 方法
接下来,代码调用了 obj 的 push 方法两次,分别传入数字 1 和 2 作为参数,将它们添加到 obj 中。由于 obj 中的 push 属性指向了 Array 原型上的 push 方法,因此这两次调用实际上会将新元素添加到 obj 中,同时更新 obj 的 length 属性的值。最后,代码使用 console.log 输出了 obj 的值,输出结果为:

{ '2': 1, '3': 2, length: 4, push: [Function: push] }

由于 push 方法会将新元素添加到数组的末尾,也就是第二个元素和第三个元素的位置,因此新元素替换了原有3和4。obj 中的数字键名实际上是元素的索引,而不是对象的属性。同时,push 方法还会更新 obj 的 length 属性,使其值变为 4。