根据ECMA标准,简单模拟出slice方法的定义:
function ArraySlice(start, end) {
var array = Object(this);
var len = array.length;
var start_i = Number(start);
var end_i = len;
if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end);
if (start_i < 0) {
start_i += len;
if (start_i < 0) start_i = 0;
} else {
if (start_i > len) start_i = len;
}
if (end_i < 0) {
end_i += len;
if (end_i < 0) end_i = 0;
} else {
if (end_i > len) end_i = len;
}
var result = new constructor(MaxSimple(end_i - start_i, 0));
if (end_i <= start_i) return result;
for (var i = 0; i < end_i - start_i; i++) {
var index = start_i + i;
if (index in array) {
var current = array[index];
result[i]= current;
}
}
result.length = end_i - start_i;
return result;
}
所以关于将类数组对象转换为数组的方法,可以用
[].slice.call(Array-like-object)
或者
Array.property.slice.call(Array-like-object)
// [].slice === Array.property.slice true
slice方法本质上是获取数组或类数组的length,再结合start、end参数生成一个新的数组。