javascriptfunction ObservedArrayPush() {
var n = TO_UINT32(this.length);
var m = %_ArgumentsLength();
try {
BeginPerformSplice(this);
for (var i = 0; i < m; i++) {
this[i+n] = %_Arguments(i);
}
var new_length = n + m;
this.length = new_length;
} finally {
EndPerformSplice(this);
EnqueueSpliceRecord(this, n, [], m);
}
return new_length;
}
// Appends the arguments to the end of the array and returns the new
// length of the array. See ECMA-262, section 15.4.4.7.
function ArrayPush() {
CHECK_OBJECT_COERCIBLE(this, "Array.prototype.push");
if (%IsObserved(this))
return ObservedArrayPush.apply(this, arguments);
var array = TO_OBJECT_INLINE(this);
var n = TO_UINT32(array.length);
var m = %_ArgumentsLength();
for (var i = 0; i < m; i++) {
array[i+n] = %_Arguments(i);
}
var new_length = n + m;
array.length = new_length;
return new_length;
}
不知道楼主是不是看了我的贴发现了这道题。抱歉啊,最开始从图到文字的时候,敲错了,没把a,b加上引号。。它俩确实是个字符串。所以原题应该是:
下面说一下Array.prototype.push。
js Array 的源码好像是这个
V8
Array.prototype.push的部分貌似是这个:
另外还有一些规范性的说明:
所以说,push会根据对象length属性的值去确定插入的位置,即类似于
this[this.length]=arguments[i]
。所以在原题中
obj.length
值为2,调用obj.push("c")
时,会发生obj[2]="c"的情况,所以最后 obj[2]就变成了'c',而不是原来的'b'。里面详细介绍了 push 方法调用时候的步骤。可以研究一下。
你这个a和b不是变量么?a的值是2,b的值是'bb'。
在网上找到一个push方法的实现,不知道正确与否,试了一下结果跟你一样的。
是在当前length所表示的位置插入或覆盖当前值。
你这样问问题会误导别人的,你的a和b如果不是变量的话,你上面的语句是根本没有办法执行的。
同意楼上的意见,你自己再仔细看看题目是不是完全
这个题是javascript中伪数组的问题,建议你查看大犀牛中的解释
http://yanhaijing.com/es5/#349