我对输出感到困惑。
var arrLike = {0:'Martin', 1:78, 2:67, 3:['L', 'M', 'P'], length: 4};
如果我在 arrLike
上使用 slice()
:
var newArr = Array.prototype.slice.call(arrLike, 0);
输出:
console.log(newArr);
["Martin", 78, 67, Array[3]]
这是怎么发生的?我无法完全理解输出结果。
最佳答案
前言:请注意,控制台输出中的 Array[3]
正是控制台向您显示的方式。你的 newArr
实际上是:
["Martin", 78, 67, ['L', 'M', 'P']]
它的发生是因为这就是 slice
的定义方式。粗略地说:
- 创建一个新的空数组
- 读取你给它的
length
属性 - 从起始索引(默认
0
)循环到结束索引(默认length - 1
);调用循环变量k
- 在向对象请求属性
k
时,将在对象中找到的任何属性放入索引为k - start
的数组中。
- 在向对象请求属性
- 将返回数组的
长度
设置为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;
}
由于您的 arrLike
对象具有 length
属性,并且具有名称为 0
、1
、2
和 3
,您将获得所显示的结果。
关于javascript - 在像 Object 这样的 Array 上使用 slice() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34796963/