Array.prototype.slice用法
等同于[].slice.call()
1,从数组中抽取出新的数组
http://www.w3school.com.cn/js/jsref_slice_array.asp 。
2,用于类数组对象,抽取出新数组
以length属性为基础
从Function中取出arguments数组:
var arg2 = Array.prototype.slice.call(arguments,0)
从document中取出数组
Array.prototype.slice.call(document.querySelectorAll("div"));
原理:含有length属性的对象都可以使用slice转换数组
var ob1 = {
'0': 1111, '1': 222, '2': 333,
// 0:1,1:2,2:3,
length:3//必须带有length属性
}
var arr = Array.prototype.slice.call(ob1,0);
console.log(arr);
3,用于将字符串转为数组
var strArr = Array.prototype.slice.call("string")
console.log(strArr);
//效果等同于split()
var strArr2 = "string".split("");
console.log(strArr2);
Tip:call方法的参数如果是原始值类型,会传入它的自动包装对象:
var arr = [].slice.call(new String('hello'));/* [ 'h', 'e', 'l', 'l', 'o' ] */
因为new String(‘hello’)就是
{
0: “h”,
1: “e”,
2: “l”,
3: “l”,
4: “o”,
length: 5
}
slice的替代实现
var _slice = Array.prototype,slice;
Array.prototype.slice = function (begin,end) {
end = (typeof end !== "undefined")?end:this.length;
//针对数组,调用原生slice方法
if (Object.prototype.toString.call(this) == '[Object Array') {
return _slice.call(this,begin,end);
}
//针对类数组,使用自定义
var i ,cloned = [],size,len = this.length;
//start 转为正数,end转为有效长度正数
var start = begin || 0;
start = (start >= 0 )?start : Math.max(0,len+start);
var upTo = (typeof end == "number") ? Math.min(len,end):len;
if (end < 0) {
upTo = end + len;
}
size = upTo - start;
if (size > 0 ) {
cloned = new Array[size];
if (this.charAt) {
for (let i = 0; i < size; i++) {
// const element = size
cloned[i] = this.charAt[start+i];
}
}else
{
for (let i = 0; i < size; i++) {
// const element = size
cloned[i] = this[start + i];
}
}
}
return cloned;
}