Array.prototype.slice.call()——详解

一、arguments

是类数组对象,我们经常需要往函数中传入参数,js把传入到这个函数的全部参数存储在atguments中 我们可以通过以下代码认识一下atguments

let fn = function () {
    //arguments的用法
    console.log("arguments=>", arguments)
    //aguments的类型
    console.log("arguments类型=>", Object.prototype.toString.call(arguments))
    //...
}
fn(1, 2, 3, 4)

根据上面arguments的类型是属于对象,js将我们传给函数的第一个参数的属性名取为“0”,第二个参数为“1”,以此类推,属性值为数字。我们还观察到arguments是具有类似数组的属性length

二、Array,prototype

我们在写项目的时候,经常需要将arguments转成数组的形式处理,这里我详细展开其中一种转换方法:Array.prototype.slice.call()

console.log("Array.prototype=>", Array.prototype)

以上可知,slice是属于 js的内置方法Array()的原型prototype属性(注:prototype属性是一个对象)的上的一个方法。

 三、slice()

可从已有的数组中返回选定的元素

  • 两个参数时:array.slice(start, end) 从原数组第start个数据,截取到第end处
  • 没有参数时:array.slice() 截取原数组所有数据 slice 并不需要 this 为 array 类型,只需要有 length 属性即可

slice本来只是Array和 String的方法,为什么可以直接用在类数组上面?我们可以看下slice()的源码

function slice(start, end) { 
    var len = ToUint32(this.length), result = []; 
    for(var i = start; i < end; i++) { 
        result.push(this[i]); } return result; 
    }
}

可以看出,slice 并不需要 this 为 array 类型,只需要有 length 属性即可。并且 length 属性可以不为 number 类型,当不能转换为数值时,ToUnit32(this.length) 返回 0. 因为arguments对象又有length属性,当然可以使用slice()来截取arguments对象里面的数据

四、call()

我们知道call()是改变this的指向的函数

let agrs = Array.prototype.slice.call(arguments)

此时我们将对象this由Array.prototype指向arguments。这样arguments即可使用数组的方法slice()了。

详细请看: 链接

猜你喜欢

转载自blog.csdn.net/qq_52421092/article/details/129774398
今日推荐