apply 可以接受两个参数,

fun.apply(thisArg[, argsArray])

其中第二个参数是数组或类数组对象,所以有时传 arguments 也很正常,但是,认真的说,我测试出来:

类数组对象:一个拥有 length 属性且值可以转为整数的对象;

实际应用中, apply 明显是将类数组中的对象一个个传入到 fun 中的,这个应该没有歧义;正常情况下,也没有什么异常,直到遇见下面代码:

Array.apply(null,{length:2});// [undefined, undefined]

而且,上面的返回值跟下面这样还是有区别的:

Array(2);//[empty × 2]

有些数组操作方法是直接忽略掉空项,但不忽略值为 undefined 的项,譬如下面的 forEach:

Array.apply(null,{length:2}).forEach(v=>console.log(1));// 输出1,两次
Array(2).forEach(v=>console.log(1))//不输出

从上面代码里,我们可以推算出 apply 的内部机制,

apply 是按照类数组对象的 length 属性,把 0 到 length-1 的数字属性的值作为参数挨个传给 func,如果没有定义其中的数字属性(这种情况一般存在于自定义的类数组对象中),那么就传 undefined

所以才会有上面的代码;不过相比:

Array.apply(null,{length:2}).forEach(v=>console.log(1));// 输出1,两次

我觉得用 ES6 会更好理解些:

Array.from({length:2}).forEach(v=>console.log(1));//同上

或者

Array().fill().forEach(v=>console.log());//同上

题外话,前面为什么猜测类数组对象的值可以转为整数就可以了呢,因为测试出来:

Array.from({length:true});//[undefined]

js apply 引申的更多相关文章

  1. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  2. [荐]Js apply()和call()方法详解 - http://www.w3cfuns.com/article-5596443-1-1.html

    本帖最后由 默默DE人生 于 2013-3-19 13:22 编辑 Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文 ...

  3. Js apply 方法 详解

    Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  4. Js apply() call()使用详解

    Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...

  5. Js apply 方法 具体解释

    Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...

  6. Js apply call方法详解

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  7. Js apply()使用详解

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  8. Js apply方法详解,及其apply()方法的妙用

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  9. Js apply方法与call方法详解 附ES6新写法

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

随机推荐

  1. OSI各层的功能和主要协议(转载)

    OSI各层的功能和主要协议: 物理层 物理层规定了激活.维持.关闭通信端点之间的机械特性.电气特性.功能特性以及过程特性.该层为上层协议提供了一个传输数据的物理媒体. 在这一层,数据的单位称为比特(b ...

  2. REST 和 SOAP、RPC 有何区别?

    第一个问题:什么是RESTful? REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的.有兴趣可以看看这里论文`,谁是Fielding?点击前面名字了解. 那RE ...

  3. Eclipse的vim插件viPlugin的安装

    1.viPlugin是什么?   viPlugin是一个eclipse 针对vi的插件,使用此插件可以让你在使用eclipse进行编码时使用几乎所有vi命令,可以极大的提高开发编码效率. 2.viPl ...

  4. Atitit.软件仪表盘(7)--温度监测子系统--电脑重要部件温度与监控and警报

    Atitit.软件仪表盘(7)--温度监测子系统--电脑重要部件温度与监控and警报 Cpu温度,风扇转速 主板温度 显卡温度 硬盘温度 电池温度 鲁大师  硬盘温度 Cpu温度  core temp ...

  5. 将多个文件夹内的txt合并

    import os import re def text_create(name): """ 创建txt文件夹 """ desktop_pa ...

  6. 基于jdom 的 xmluti

    package cn.com.do1.wechat.common; import org.jdom.Attribute; import org.jdom.Document; import org.jd ...

  7. jfinal中Interceptor的使用

    一.拦截器是用于对action请求的拦截处理,发生在进入action方法体之前的拦截操作,这样方便了对请求实例做一些文章.   二.自定义.系统已有拦截器都需要实现Interceptor接口,这样才能 ...

  8. R ggplot2 改变颜色

    p<-ggplot(iris,aes(Petal.Length,Petal.Width,color=Species))+geom_point()cols=c("red",&q ...

  9. flume+kafka

    这里演示在单机fulume环境下,kafka作为source ,chanel , sink时三种情况 下面的测试都是基于下面的基本的配置文件进行修改的 a1.sources = r1 a1.sinks ...

  10. Webpack实例教程及模块化规范

    Webpack 是当下最热门的前端资源模块化管理和打包工具.它能够将很多松散的模块依照依赖和规则打包成符合生产环境部署的前端资源. 通过 loader 的转换,不论什么形式的资源都能够视作模块,比方 ...