Javascript阵列推送代码如何在内部工作

时间:2014-12-09 18:33:44

标签: javascript arrays

javascript中Push和Pop方法的内部代码逻辑是什么? Push方法如何将值存储在Array中。

2 个答案:

答案 0 :(得分:1)

pushpop方法是有意通用的,它们只依赖于length属性的存在,并且可以添加和删除属性。

push方法将读取length属性,添加具有该名称的属性,并增加长度。基本上是:

function push(value) {
  var len = this.length;
  this[len] = value;
  len++;
  this.length = len;
  return len;
}

pop方法将读取length属性,减少它,获取具有该名称的属性并删除该属性。基本上是:

function pop() {
  var len = this.length - 1;
  var value = this[len];
  this.length = len;
  delete this[len];
  return value;
}

实际的实现有点复杂,因为它们支持push方法的多个参数,以及一些错误检查。当对象实际上是一个数组时,也可能会实现特殊的优化代码,但是通用代码仍然存在于其他对象中。

这些方法是有意通用的,因此它们可以用在实际上不是数组的对象上。您只需拥有length属性即可创建自己支持它们的对象:

var o = {
  length: 0,
  push: Array.prototype.push,
  pop: Array.prototype.pop
};

o.push(1);
var one = o.pop();

演示:http://jsfiddle.net/Guffa/9r4gavzb/

答案 1 :(得分:0)

我们可以尝试一些测试和测试行为:

const arr1 = []
const { push: push1 } = arr

const arr2 = []
const { push: push2 } = arr

console.log(push1 === push2) // true
console.log(push1 === Array.prototype.push) // true

push1(1) // TypeError: Cannot convert undefined or null to object

push1.call(arr1, 1) // arr1: [1], arr2: []

push2.call(arr1, 2) // arr1: [1, 2], arr2: []

push1.bind(arr2)(1) // arr1: [1, 2], arr2: [1]

push.call(arr2, 2)

我们可以说 push 方法在幕后使用了 this...