javascript学习笔记(1)Array.prototype.slice用法

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;

        

}
发布了19 篇原创文章 · 获赞 2 · 访问量 1776

猜你喜欢

转载自blog.csdn.net/karaa/article/details/89280610
今日推荐