假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢?

这个语法其实不难理解,只是它有些不好看。Array 是 JavaScript 的基本类型,你可以使用 Array.prototype 获取它的属性值,在这里我假设你已经了解了 prototype 的概念。

slice 是 JavaScript 的一个方法,用于选取一个数组的一部分数据,并返回一个新的数组。它可以接收两个参数,startIndex(必选)和 endIndex。因此:

var a = ["a", "b", "c"];
a.slice(1,2);

将返回数组 ["b"],它包含 a 数组从 1 到 2 之间元素。而:

var a = ["a", "b", "c"];
a.slice(1);

则会返回数组 [“b”, “c”],它包含 a 数组从 1 到最后一个元素之间元素。

这里的 a 是个数组,那么变量 arguments 呢?

众所周知,当你调用 JavaScript 的函数的时候,会创建一个隐藏的名为 arguments 的参数,你是不是觉得它就是一个数组呢?答案是否定的,它是一个对象,但是与数组类似。

function f () {
return arguments;
} f("1", "2") instanceof Array;

这里,你会得到 FALSE 的结果,就是说我们不能像平常一样使用 Array 的函数,例如:push,pop,slice等等这些。但是我想使用这些方法,应该怎么办呢?

我们可以使用 Array.prototype.slice.apply(arguments) 对参数进行转换为真正的 Array。这里我们使用了 JavaScript 的 apply 方法,通过这个方法可以更好的了解 JavaScript 中调用函数的另一种方法。该方法将 slice 应用到第一个参数 arguments 中,并返回一个数组。

Array.prototype.slice.apply(f("1", "2")) instanceof Array;

现在可以看到这里返回 TRUE 的结果!!

PS:在 ECMAScript5 中,我们只需要直接调用 arguments.slice() 即可。

[转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)的更多相关文章

  1. JavaScript中的Array.prototype.slice.call()方法学习

    JavaScript中的Array.prototype.slice.call(arguments)能将有length属性的对象转换为数组(特别注意: 这个对象一定要有length属性). 但有一个例外 ...

  2. 理解javascript中的Function.prototype.bind

    在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...

  3. javascript:Array.prototype.slice.call(arguments)

    我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js ...

  4. 理解 JavaScript 中的 Function.prototype.bind

    函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其 ...

  5. 理解Array.prototype.slice.call(arguments)

    在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理: 1.基本讲解 1.在 ...

  6. Array.prototype.slice.call(arguments) 通俗法理解

    Array.prototype.slice.call(arguments,num) 能将具有length属性的对象转成数组.   slice 从字面上的意思可以理解为截取数组的一部分. call 从字 ...

  7. js Array.prototype.slice.call(arguments,0) 理解

    Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...

  8. 关于在函数中使用Array.prototype.slice.call而不是直接用slice

    arguments是每个函数在运行的时候自动获得的一个近似数组的对象(除了length外没有其他属性),这个arguments对象其实并不是Array,所以没有slice方法. Array.proto ...

  9. 详解 Array.prototype.slice.call(arguments)

    首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组 在这里我们看第二个方法 1.在JS里Array是一个类 slice是 ...

随机推荐

  1. PHP 进行支付宝开发中return_url和notify_url的区别分析

    在支付宝处理业务中return_url,notify_url是返回些什么状态呢,我们要根据它来做一些处理就必须了解return_url,notify_url的区别,下面我就来给大家介绍; 一.问题描述 ...

  2. WebStrom直接启动VUE项目

    点Run即可启动

  3. IDEA 实用功能Auto Import:自动优化导包(自动删除、导入包)

    JetBrains公司的intellij Idea堪称JAVA编程界的苹果,用户体验非常好 下面介绍一下IDEA的一个能显著提升写代码效率的非常好用的功能设置—— Auto Import Auto I ...

  4. linux4.10.8 内核移植(一)---环境搭建及适配单板。

    一.环境搭建 源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz 或者直接去kernel. ...

  5. js正则匹配table,img及去除各种标签问题

    //获取公示栏内容 s = "$row.detail$"; mainContent =s; //如果有多个table使用下面注释的正则只会匹配成一个table //var tabR ...

  6. luogu P3674 小清新人渣的本愿

    传送门 毒瘤lxl 本质是莫队,关键是怎么处理询问 这里需要开两个bitset(记为\(b1,b2\)),分别存\(x\)和\(n-x\)是否出现 对于询问1,即\(x-y=z\),由于\(y=x-z ...

  7. python技巧 一等函数

    函数在python中作为一等函数,具有以下特点: 1.可以作为参数传递给其他函数 2.作为其他函数的值返回 3.能赋值给变量或数据结构中的元素 4.在运行的时候创建 In [1]: def add(x ...

  8. HTML5中<template>标签的详细介绍

    HTML5中<template>标签的详细介绍(图文) 这篇文章主要介绍了HTML5中的template标签,是HTML5入门中的重要知识,需要的朋友可以参考 一.HTML5 templa ...

  9. Maven安装配置操作

    1)下载maven安装包并解压: 2)环境变量配置: 3)编辑环境变量Path,追加%MAVEN_HOME%\bin; 4)maven安装配置后进行dos命令检查:在cmd中输入 mvn -v 5)配 ...

  10. Linux内核调试 - 一般人儿我都不告诉他(一)【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...