javascript中Push和Pop方法的内部代码逻辑是什么? Push方法如何将值存储在Array中。
答案 0 :(得分:1)
push
和pop
方法是有意通用的,它们只依赖于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();
答案 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
...