解析 Array.prototype.slice.call 的作用

先来明白 Array.prototype.slice 和 call的作用

Array.prototype.slice

slice(begin, end) 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

注意: 包含 begin,但不包含 end,如slice(0, 5) 截取的是数组中第0个索引到4个索引元素,是不包含结尾索引5的。

参考链接:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

call

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

参考链接:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call

Array.prototype.slice.call 作用:

最后加一个slice js原生代码实现:


// Array.prototype.slice() 实现

function slice (begin, end) {
    // 创建一个新数组,所以 slice 是不影响原数组的
    var newArrary = [];
    // 开始索引
    var begin = begin || 0;
    // 结束索引,默认为当前调用数组的长度,this是调用的数组,比如 [].slice(0, 5); this指的就是 [] 这个数组对象的引用
    var end = end || this.length;
    // 用开始索引 和 结束索引 去声明一个for循环
    for (var i = begin; i < end; i++) {
        // this 指向的是调用的数组,所以这里就实现了,截取的功能
        newArrary.push(this[i]);
    }
    // 最后返回新的数组
    return newArrary
}

console.log([1, 2, 3, 4, 5].slice(0, 3));
// 所以 slice 是不包含结束索引值的, 因为 i < end 的原因,比如这里:  0 < 3, 1 < 3, 2 < 3, 3 < 3 吗? 不小于所以跳出循环,返回结果
// 输出结果: [1, 2, 3]

部分资料引自 MDN

原文地址:https://www.cnblogs.com/xiaolantian/p/12616947.html

时间: 2024-11-04 15:39:24

解析 Array.prototype.slice.call 的作用的相关文章

观V8源码中的array.js,解析 Array.prototype.slice为什么能将类数组对象转为真正的数组?

在官方的解释中,如[mdn] The slice() method returns a shallow copy of a portion of an array into a new array object. 简单的说就是根据参数,返回数组的一部分的copy.所以了解其内部实现才能确定它是如何工作的.所以查看V8源码中的Array.js     可以看到如下的代码: 一.方法  ArraySlice,源码地址,直接添加到Array.prototype上的"入口",内部经过参数.类型

(转)Array.prototype.slice.call自解

很多框架或者库里面都会有这句的使用,最多的还是通过Array.prototype.slice.call(arguments,0)把arguments这个伪数组转换为真正的数组.但为什么可以这么做,却一直是半懂不懂的.昨天晚上看了mootools的源码,google了一下,终于彻底明白了. call方法的作用就不用多说了,Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0),但因为arguments不是真正的Array,所以它没

类数组转数组Array.prototype.slice.call(arrayLike)

转换方式:Array.prototype.slice.call(arrayLike) 附:(http://www.jianshu.com/p/f8466e83cef0) 首先Array.prototype.slice.call(arrayLike)的结果是将arrayLike对象转换成一个Array对象.所以其后面可以直接调用数组具有的方法.譬如 Array.prototype.slice.call(arrayLike).forEach(function(element,index){  //可

Array.prototype.slice.call(document.querySelectorAll(&#39;a&#39;), 0)

Array.prototype.slice.call(document.querySelectorAll('a'), 0)的作用就是将一个DOM NodeList 转换成一个数组. slice()方法可提取字符串的某个部分,并以新的字符串返回被提取的部分.语法为arr.slice([begin[, end]]),其中arr可为string或Array.更多了解可以参考MDN document.querySelectorAll('a')获取了一个NodeList对象,它看起来像一个数组,你可以使用

浅谈Array.prototype.slice.call(arguments,0)

在谈论这个问题之前 我们先了解下call的用法及作用 对象.方法.call(obj[,arg1[, arg2[,   [,.argN]]]]]):调用一个对象的一个方法,以另一个对象替换当前对象. 1 function Personal(a){ 2 3 this.name = a; 4 5 this.say = function(){ 6 7 alert(a) 8 } 9 10 } 11 12 function Man(a){ 13 14 this.sex = "maie"; 15 P

将函数的实际参数转换成数组的方法,习惯用Array.prototype.slice.call(arguments)

实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组. 方法一:通过Array.prototype属性调用slice方法 var args = Array.prototype.slice.call(arguments); Array 本身是没有 slice 方法,它的方法在 Arr

Array.prototype.slice.call(arguments)

话说可以通过call()来让arguments来继承array的slice()方法. 可是为何使用arguments.slice(1)会报错, 而这样使用Array.prototype.slice.call(arguments,1)就可以正常. function name(){ Array.prototype.slice.call(arguments); console.log(arguments.slice(1)); } name("some","thing");

伪数组转为数组 Array.prototype.slice.call(arguments)

我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换) 1 var a={length:2,0:'first',1:'second'}; 2 Array.prototype.slice.call(a);// ["first", "second"] 3 4 var a={length:2}; 5

Array.prototype.slice &amp;&amp; Array.prototype.splice 用法阐述

目的 对于这两个数组操作接口,由于不理解, 往往被误用, 或者不知道如何使用.本文尝试给出容易理解的阐述. 数组 什么是数组? 数组是一个基本的数据结构, 是一个在内存中依照线性方式组织元素的方式, 其中元素的类型必须是相同的, 这个每个元素的索引地址才能被计算出来, 索引通常是数字,用来计算元素之间存储位置的偏移量. 结构如下: javascript数组 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob