javascript基础-arguments对象

arguments是函数内部自带的对象,它是一个类数组的存在,所谓的类数组就是没有数组的方法,
        但可以通过下标来访问内部的元素,也有length属性。它的作用呢?
        保存了函数调用的时候传入的实际的参数,通过length属性可知道传入参数的数量。
        比如例子中的函数fn
function fn(arg1,arg2,arg3,arg4)
        {
            //此时arguments.length不是4,因为它不是由声明函数时的形参数量决定的
            //而是由调用fn时传入的参数的数量决定的
        }    

        fn(1,2,3);   arguments.length是3
        fn(1);        arguments.length是1

于是得知:length的值是由调用函数传递的参数决定的而不是由声明函数时的形参的个数决定的.

一些想法:arguments是一个对象,对象是一个不固定的存在,也就是活的东西,你可以这样理解。
相反的比如数字2,它是固定的存在,所占的内存大小是固定的,不可以变的。对象显然不是
那么调用函数时传入的参数不与声明函数时参数的数量保持一致也就可以理解啦。
调用时无论传入的函数的参数个数是多少,形参不会有任何的怨言,函数也不会发脾气报错啥的,因为最终都会保存在arguments对象中。形参好像就只是一支"花瓶"!

接着:非严格模式下,没有在script标签内使用"use strict";

通过arguments可以修改传入的形参的值,当然有一个共同的前提条件,形参必须存在,而且值不为特殊的值undefined
eg:



function fn1(arg1,arg2,arg3)
        {
            //arg1值存在
            console.log(arg1);    //1
            arguments[0] = 20;
            console.log(arg1);    //20

            //arg3值特殊值undefined,因为函数调用时没有传入,那么这样的修改是无效的
            console.log(arg3);  //undefined
            arguments[2] = 100;
            console.log(arg3);    //undefined        //依然是undefined,修改无效

        }

        fn1(1,2);

相反的:通过形参也可以修改对应的arguments的值。前提也是arguments的值不是特殊值undefined



function fn2(arg1,arg2,arg3)
        {
            //arguments[0]值存在,通过修改arg1的值,arguments[0]的值也得到修改
            console.log(arguments[0]);    //1
            arg1 = 20;
            console.log(arguments[0]);    //20

            //arguments[3]值是特殊值undefined,函数调用时没有传入,修改arg3的值,arguments[3]的值是不会得到修改的的
            console.log(arguments[2]);  //undefined
            arg3 = 100;
            console.log(arguments[2]);    //undefined        //依然是undefined,修改无效

        }

        fn2(1,2);

接着:如果在严格模式下,上述的两种修改不生效的。严格模式下,形参的值是与arguments的值是独立的,没有任何的关系。"你走人的独木桥,我走我的阳关道"!
(Javascript高级程序设计第3版PDF的说法好像是错误的。)

引申:既然arguments是函数内部的一个参数对象的,那么除了在非严格模式下修改对应的形参的值
还有没有其他的作用呢?
有:模拟函数的重载。因为函数是没有重载的。同名函数后面的函数会覆盖前面的函数(可以脑补下)。

重载:通过传入调用时参数的个数不同在同一个函数中实现不同的功能

eg: 模拟函数的重载,参数个数是1的时候打印1。其他的情况打印2

function fn3(arg1,arg2)
        {
            if (arguments.length == 1)
            {
                console.log(1);
            }
            else
            {
                console.log(2);
            }
        }

如果看完觉得有一些收获,我感到很荣幸;如果觉得也不过如此,那么我会努力的提高自身的知识水准与表达水准;如果觉得不过如此的同时还能指点一二,那么我将感激不尽,因为我觉得能够指点你的人必定有过人之处;如果能够给予评论并指出不足,那么我将非常开心,有人帮助你那么将是一件非常不错的事情!

 
时间: 2024-10-25 15:35:27

javascript基础-arguments对象的相关文章

javascript的arguments对象简单介绍

javascript的arguments对象简单介绍:这里以最简单的方式介绍一下arguments对象的用法,先看一段代码: var a=1; var b=2; function mytest(a,b){ var c=a+b; document.write(arguments[0]); } mytest(1,2); 以上代码可以输出传递给函数的第一个参数,也就是说通过类似于数组的索引值可以访问传递给函数的参数,而无需使用参数的名称.这里就介绍这么多了,希望能够给初学者一个最初的理解. 原文地址是

JavaScript基础--DOM对象加强篇(十四)

1.document 对象 定义:document对象代表的整个html文档,因此可以去访问到文档中的各个对象(元素)document重要的函数 1.1 write 向文档输出文本或js代码 1.2 writeln 向文档输出文本或者js代码,与write不一样的地方是,writeln是换行输出. 比如: document.write("hello");document.writeln("ok"); hello ok 但是对浏览器来看,输出效果没有区别. 1.3 g

JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象模型)DOM是HTML与XML的应用编程接口(API) BOM和DOM相辅相成的关系BOM为纲,DOM为目,DOM是BOM的具体体现 3.DOM对象 3.1 Windows对象 3.1.1 confirm function test(){ var res= window.confirm("你要删除&

JavaScript 基础回顾——对象

JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中,对象被定义为无序属性的集合,属性可以是任何类型的值,包括其他对象或函数.函数作为属性值时称为“方法”,即对象的行为. (1)对象常用的内部属性 对象的内部属性是由JavaScript 规范定义的,由运行代码的系统来访问.对象常用的内部属性: prototype        对象        获

[译]Javascript 参数(arguments)对象

本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU&list=PL6n9fhu94yhUA99nOsJkKXBqokT3MBK0b Javascript 参数(arguments)对象是一个在所有函数中都可用的本地变量.其包含了所有传给函数的参数,并且像数列一样排着序.参数对象的长度就是传给函数的参数个数. JavaScript 参数对象例子: fu

JavaScript的arguments对象

1.在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性.arguments非常类似Array,但实际上又不是一个Array实例.可以通过如下代码得以证实(当然,实际上,在函数funcArg中,调用arguments是不必要写成funcArg.arguments,直接写arguments即可). 1 Array.prototype.testArg = "test"; 2 function funcArg() { 3 alert(funcA

javascript参数arguments对象

ECMAScript函数的参数与大多树其他语言中函数的参数有所不同.ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么类型.函数体是通过arguments对象来访问参数数组.arguments对象只是与数组类似,但并不是数组实例. 例如,在函数 sayHi() 中,第一个参数是 message.用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推). 因此,无需明确命名参数,就可以重写函数: funct

2015第37周五javascript函数arguments对象巧用一

Javascript函数的一个巧妙利用:假定action中有一个JSONObject类型的对象data,其值有可能为空,则前台JSP页面的JS代码中想直接通过EL表达式,即${data}的形式访问对象的值,则可能会因为data对象为空导致JS预处理错误,如JSP中有这样的代码,var obj=${data};,则当后台data为null时前台页面会变成var obj=;进而页面报错终止运行.有人想通过类似 var obj=('${data}'==''?{}:${data})来解决,但该代码依旧编

JavaScript基础_04对象与函数

1 变量作用域和作用域链 作用域:指的是变量和函数的访问范围,也就是说作用域控制着变量的可见性和生命周期,包括局部作用那个与和全局作用域: 局部作用域:指的是一般只在固定代码片内可以访问的作用域,常见的在函数内部定义的变量或函数: 全局作用域:指的是在代码任何地方都可以访问的变量或对象. 例如在下面函数中,alert(a1)首先在fun2函数区域寻找有定义的a1变量,如果有,就使用fun2函数中定义的变量a1,如果没找到,就继续一层一层向父级函数找,在fun1中找到了,就使用fun1中定义的变量