在js中一切都是对象,连函数也是对象,函数名其实是引用函数定义对象的变量。

什么是arguments?

这个函数体内的arguments非常特殊,实际上是所在函数的一个内置类数组对象,可以用数组的[i]和.length。

每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合。arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments。arguments对象不能显式的创建,它只有在函数开始时才可用。

 

arguments有length属性,arguments.length 为函数实参个数,可以用arguments[length]显示调用参数:

function func(){

for(var i=0;i<arguments.length;i++){

console.log(arguments[i]);

}

}

arguments的应用

1. arguments.callee为引用函数自身。我们可以借用arguments.length可以来查看实参和形参的个数是否一致

function add(a, b) {

var realLen = arguments.length;

console.log("realLen:", arguments.length);

var len = add.length;

console.log("len:", add.length);

if (realLen == len) {

console.log('实参和形参个数一致');

} else {

console.log('实参和形参个数不一致');

}

};

add(1,2,3,6,8);

2.我们可以借用arguments.callee来让匿名函数实现递归

var sum = function(n) {

if(n == 1) {

return 1;

} else {

return n + arguments.callee(n-1);

 }

}

console.log("sum =", sum(5));

3.编写一个函数求传入的若干个数字(不能用数组显示传入)的和

function add() {

//console.log("length", arguments.length);

var len = arguments.length;

var sum = 0;

for (var i = 0; i < len; ++i) {

sum += arguments[i];

}

return sum;

};

add(1,2,3,6,8);

4.如何将arguments转成了一个实实在在的数组

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,

首先我们看看call是干啥的,举个例子:

ar obj1={

name:"java"

}

window.name="javascript";

var func=function(){

console.log(this.name);

}

func();  //javasript

func.call(obj1); //java

我们可以很清楚的看到,call的一个作用是可以改变函数运行的作用域,func中的this指向了obj1。

那Array.prototype.slice.call(arguments)是干啥的呢,首先我们猜测Array.prototype.slice是一个方法,将它call(arguments)之后,Array.prototype.slice中的this就指向了arguments对象了。

其实Array.slice是一个数组复制函数,它接受两个参数(strat,[end]);从下标为start复制到下标为end,举个栗子:

var numArr=[1,2,3,4,5];

console.log(numArr.slice(0,4)); //[1,2,3,4]

console.log(numArr.slice()); //[1,2,3,4,5]

console.log(numArr.slice(1)) //[2,3,4,5]

我们可以大胆的猜测一下slice函数的内部实现:

Array.prototype.slice = function(start,end){

var result = new Array();

start = start || 0;

end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键

for(var i = start; i < end; i++){

result.push(this[i]);

}

return result;

}

注意当中的result.push(this[i]),当Array.prototype.slice.call(arguments)后,就变成了result.push(arguments[i]),这样就将arguments转成了一个实实在在的数组了。

js中arguments详解的更多相关文章

  1. js中eval详解,用Js的eval解析JSON中的注意点

    先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...

  2. js中apply详解

    学习http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html 1.对象的继承,一般的做法是复制:Object.extend protot ...

  3. Node.js中Async详解:流程控制

    安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 集合 ...

  4. Angular JS 中 指令详解

    Angular JS的强大功能就在于其可以自定义很多指令,现在就指令做一下详细的剖析. 一个Angular js 指令(directive)需要指定一个唯一的名字(myDirective)和一个函数, ...

  5. js中this详解

    this对象是在闭包一节中提到的,书上的原话是:"this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对 ...

  6. js中eval详解

    先来说eval的用法,内容比较简单,熟悉的可以跳过   eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. ...

  7. JavaScript中的arguments详解

    1. arguments arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性. (function () { console.log(ar ...

  8. Js apply 方法 详解

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

  9. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

随机推荐

  1. Spring使用ajax异步上传文件

    单文件上传 <!-- 创建文件选择框 --> 文件上传 :<input type="file" id="file" name="fi ...

  2. 修改tomcat命令黑窗口的名字

    一.为什么要修改tomcat黑窗口的名字 同时启动多个tomcat时,不好区分,而给tomcat的命令窗口取名区分是个不错的选择,例如下面这个效果. 二.修改的方法 1.找到tomcat的bin目录下 ...

  3. js数据类型有哪些,js属性和方法的归属,

    1.js的数据类型有哪些? 2.全局方法和全局属性? 一 1.js的本质就是处理数据,数据来自后台的数据库.所以变量就起到一个临时存储数据的作用. ECMAScript 制定了js的数据类型. 数据类 ...

  4. 借鉴Glide思想二次封装Fresco

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近封装了个 Fresco 的组件库:DFresco,就顺便来讲讲. 背景 Fresco 图片库很强大,我们项目中就是使用的 Fre ...

  5. 2018-10-10 在浏览器插件中读取JSON资源文件

    续前文: 浏览器插件实现GitHub代码翻译原型演示 此改进只为演示: 词典数据提取到json文件 · program-in-chinese/webextension_github_code_tran ...

  6. Spotlight on Mysql在Windows平台下的安装及使用简介

    Spotlight on Mysql在Windows平台下的安装及使用简介   by:授客 QQ:1033553122 1.   测试环境 Win7 64位 mysql-connector-odbc- ...

  7. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

  8. 2018-05-11-机器学习环境安装-I7-GTX960M-UBUNTU1804-CUDA90-CUDNN712-TF180-KERAS-GYM-ATARI-BOX2D

    layout: post title: 2018-05-11-机器学习环境安装-I7-GTX960M-UBUNTU1804-CUDA90-CUDNN712-TF180-KERAS-GYM-ATARI- ...

  9. 使用 pjsip 代码独立开发

    1.在不改动pjsip代码的情况下,和pjsip工程目录并行建立win32控制台程序工程P2PTraversal 目录结构如下: . ├── pjproject-2.6 └── pjsipdemo 2 ...

  10. MySQL 5.7开启二进制日志注意事项

    最近才开始将部分MySQL 5.6升级到MySQL 5.7, 在开启MySQL的二进制日志时,发现MySQL 5.7 与MySQL 5.6已有细微区别.如果在my.cnf配置文件中,只设置了全局系统变 ...