我对输出感到困惑.
var arrLike = {0:'Martin', 1:78, 2:67, 3:['L', 'M', 'P'], length: 4};
Run Code Online (Sandbox Code Playgroud)
如果我使用slice()的arrLike:
var newArr = Array.prototype.slice.call(arrLike, 0);
Run Code Online (Sandbox Code Playgroud)
输出:
console.log(newArr);
["Martin", 78, 67, Array[3]]
Run Code Online (Sandbox Code Playgroud)
这是怎么发生的?我无法用输出结束我的头脑.
前言:请注意,Array[3]控制台输出中的控件是控制台向您显示的方式.你newArr真的是:
["Martin", 78, 67, ['L', 'M', 'P']]
Run Code Online (Sandbox Code Playgroud)
它发生的原因在于如何slice定义.松散地说:
length你给它的属性0)循环到结束索引(默认length - 1); 调用循环变量k
k在索引处向属性请求属性时,放置在对象中找到的任何属性k - start.length将返回的数组设置为k - start.或者(再次非常松散):
function slice(start, end) {
var n, k, result;
start = arguments.length < 1 ? 0 : +start;
end = arguments.length < 2 ? +this.length : +end;
result = [];
for (var k = start, n = 0; k < end; ++k, ++n) {
if (n in this) {
result[n] = this[k];
}
}
result.length = n;
return result;
}
Run Code Online (Sandbox Code Playgroud)
因为你的arrLike对象有一个length属性,并与该名称的属性0,1,2,和3,你得到你所显示的结果.