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

本文详细解释了JavaScript中Array.prototype.slice方法的工作原理及其应用场景,同时介绍了call方法如何改变函数的作用域并应用于非数组对象。
1。Array.prototype:就是Array的原型,很多时候理解这个原型有点不清不楚的

其实,有点像.NET里的反射

一个类凡是通过prototype加的属性,方法,都可以在这个类的对象里找到 对象.

有时候我们也直接在某一对象添加属性方法,那么只能这个对象里找到,重新创建的对象是没有

刚刚在上一对象里添加的属性方法的

内置的类型可以通过prototype找到内置的属性方法

Array.prototype.slice这句就是访问Array的内置方法

因为Array是类名,而不是对象名,所以不能直接用Array.slice



2。接下来说slice方法,这个简单

返回一个数组的一段。arrayObj.slice(start, [end]) 参数开始索引和结束索引,结束索引可以省略

3。call方法

call([thisObj[,arg1[, arg2[, [,.argN]]]]])

调用一个对象的一个方法,以另一个对象替换当前对象

thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

这东西JS文档里我没找到怎么调用这个方法,功能是 调用一个对象的一个方法 自己的参数只有方法的所有者对象和要调用的方法参数,

查过资料才知道,Array.prototype.slice.call 是这么调用,只要 typesof fn ==="function" 的 fn类型都有 call 方法


伪组数元素

call 方法以另一个对象替换当前对象
thisObj 可选项。将被用作当前对象的对象。
这就是说:Array.prototype.slice.call(arguments,0) 这句里,就是把 arguments 当做当前对象
也就是说 要调用的是 arguments 的slice 方法,后面的 参数 0 也就成了 slice 的第一个参数slice(0)就是获取所有

为什么要这么调用 arguments 的slice 方法呢?就是因为 arguments 不是真的组数,typeof arguments==="Object" 而不是 "Array"

它没有slice这个方法,通过这么Array.prototype.slice.call调用,JS的内部机制应该是 把arguments对象转化为Array

因为Array.prototype.slice.call调用后,返回的是一个组数



经典例子:
<script type="text/javascript">//<![CDATA[
function classA() {
this.name='bluedestiny';
this.show = function () {
alert(this.name);
}
}
function classB() {
this.name = 'never-online';
}

var objA = new classA();
var objB = new classB();

objA.show.call(objB);
//]]></script>

跟call类似的还有 apply 方法

应用某一对象的一个方法,用另一个对象替换当前对象。

apply([thisObj[,argArray]])

参数

thisObj
可选项。将被用作当前对象的对象。
argArray
可选项。将被传递给该函数的参数数组。

说明

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
呵呵,这么火星的功能,实在是少见啊,估计也就是JS里

两者的区别: 对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入
JavaScript 中,类数组对象(如 `arguments` 对象或 DOM 操作返回的 `NodeList`)不具备数组的方法,例如 `slice()`、`map()` 等。为了将这些类数组结构转换为真正的数组以便使用数组方法,开发者常常使用 `Array.prototype.slice.call()`。 ### 作用 `Array.prototype.slice.call(arguments)` 的作用是将一个类数组对象转换为一个新的数组实例。这种技术利用了函数的 `.call()` 方法来改变 `slice()` 函数内部 `this` 的指向,使其可以操作非数组的对象。由于 `slice()` 本身只需要访问对象的索引和 `length` 属性,因此任何具有这两个特性的对象都可以被“切片”成数组。 通过这种方式,`arguments` 对象可以像数组一样进行操作,比如遍历、过滤等[^3]。 ### 使用方法 基本语法如下: ```javascript Array.prototype.slice.call(arrayLikeObject, start, end); ``` - `arrayLikeObject`:要转换的类数组对象。 - `start`(可选):开始索引,默认为 `0`。 - `end`(可选):结束索引(不包含该索引对应的元素),默认为 `this.length`。 #### 示例 1. **将 `arguments` 转换为数组** ```javascript function example() { const args = Array.prototype.slice.call(arguments); console.log(args); // 输出: [1, 2, 3] } example(1, 2, 3); ``` 2. **将 `NodeList` 转换为数组** ```javascript const divs = document.querySelectorAll('div'); const divArray = Array.prototype.slice.call(divs); console.log(divArray); // 输出: [div, div, div, ...] ``` 3. **从特定索引开始转换** ```javascript function example() { const args = Array.prototype.slice.call(arguments, 1); console.log(args); // 输出: [2, 3] } example(1, 2, 3); ``` 4. **替代写法:使用 `[].slice.call()`** 除了完整的 `Array.prototype.slice.call(...)` 写法,也可以简写为: ```javascript const args = [].slice.call(arguments); ``` 这种方式更为简洁,并且功能完全一致[^2]。 ### 原理简析 `slice()` 方法本质上并不依赖于对象是否是真正的数组,而是检查其是否具备 `length` 属性以及可以通过索引访问元素。因此,只要传入的对象满足这些条件,`slice()` 就可以将其转换为数组。通过 `.call()` 或 `.apply()`,可以动态地将 `this` 绑定到目标对象上,从而实现类数组对象的“数组化”处理[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值