事出有因

今天去做了金山网络招聘实习生的试卷,有一道题目确实让我有点在当时不太肯定,毕竟自己的脑袋还不是javascript解析器,然后回来就打开chrome的控制台,执行后就认为自己要去总结这个知识点了。

题目例如以下(仅仅能说大概,有点忘记,可是考察知识点是一样)

  • function foo(a,b,c){
  • c = 3;
  • console.log(arguments);
  • }
  • foo(1,2)
  • foo(1,2,undefined)

确实当时看见这道题目的时候,心里还是有非常多疑问的,最后仅仅能归结成一个是arguments对象是什么时候才赋值?

了解arguments

arguments的基本信息
1 它不是真正的数组,仅仅是一个类数组的对象,详细两者有什么差别,这个不是我们这篇文章了解的重点;
2 它创建于函数定义,并设置为null,赋值于函数调用,它是一个指向函数的參数列表的引用,是函数体訪问形參的接口
3 它仅仅能作用于该函数的函数体,在外界訪问这个对象会出错或者仅仅是null
arguments奇葩行为
1 由于它是类数组的对象,它具有一个length属性还有就是能够用下标来訪问參数列表
2 由于它是函数的属性,假设你在函数体中又一次定义一个arguments变量,它会覆盖原来的arguments

代码:

  • function foo(a,b,c){
  • var arguments = 1;
  • console.log(arguments);
  • }
  • foo(1,2)

结果:1

3 在非严格的情况下,我们能够通过arguments来改动參数列表

代码:

  • function foo(a,b,c){
  • arguments[0] = "monkindey";
  • console.log(a);
  • }
  • foo(1,2)

结果:"monkindey"

那好吧,我们还是揭秘金山实习生招聘的笔试题

foo(1,2)
答案:[1,2]
原因:arguments标示符在《javascript权威指南》中指出,它是指向实參对象的引用。实參对象是一个类数组,当实參对象改,那么arguments也会跟着改。而实參对象仅仅有在函数调用时才赋值,比方上面实參对象就类似于{a:1,b:2},可是没有c,所以给c赋值,改变不了实參对象,而arguments是它的引用,所以它也没影响。
foo(1,2,undefined)
答案:[1,2,3]
原因:实參对象会是{a:1,b:2,c:undefined},而在函数体中再改动c的话,就会设置实參对象中的c为3。所以console.log(arguments)会变成[1,2,3]

再练练兵

函数内部声明的局部变量与形參同名
  • function foo(a,b,c){
  • var a = 3;
  • console.log(arguments[0]);
  • }
  • foo(1,2)
答案:3
原因:个人认为当我们调用一个函数,传入进去的实參,就是给一个函数中的形參赋值,事实上相当于在函数定义一个局部变量,变量名就是那个形參名,上面的代码能够看成

  • function foo(a,b,c){
  • var a = 1;//传入实參的形參相当于在函数体中定义一个局部变量
  • var a = 3;
  • console.log(arguments[0]);
  • }
  • foo(1,2)
假设仅仅是声明局部变量a,却不赋值,情况又不一样了
  • function foo(a,b,c){
  • var a ;
  • console.log(arguments[0]);
  • }
  • foo(1,2)
答案:1
原因:上面的代码能够看成

  • function foo(a,b,c){
  • var a = 1;//传入实參的形參相当于在函数体中定义一个局部变量
  • var a ;//反复定义一个变量可是又不赋值,javascript解析器会把它忽略掉的(我的猜想)
  • console.log(arguments[0]);
  • }
  • foo(1,2)

參考文献

arguments MDN
《javascript权威指南》
JavaScript函数參数的可改动性

javascript(arguments)相关推荐

  1. JavaScript arguments对象

    1.在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性.arguments非常类似Array,但实际上又不是一个Array实例.可以通过如下代码得以证 ...

  2. javascript arguments

    此文为转载文章: 什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments ...

  3. JavaScript学习系列3 -- JavaScript arguments对象学习

    在实际项目开发中,目前还是很少使用到JavaScript 中的arguments对象,那么它到底是干什么用的呢 arguments是JavaScript中的一个类数组对象,它代表传给一个正在执行的函数 ...

  4. JavaScript -- arguments、apply 、call、bind

    前言 笔记来源:JavaScript 高级程序设计 笔记内容:apply .call.bind 相同点与不同点 运行环境:浏览器环境 arguments ECMAScript 中的参数在内部是用一个数 ...

  5. javascript arguments对象研究--针对jquery源码研究再研究

    外部插件: $.fn.tinytip = function(text, customOptions) {     debugger;         if (text && typeo ...

  6. javascript arguments(转)

    什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agru ...

  7. javascript arguments 特殊 对象

    在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问它们, arguments对象:在函数执行时函数内部就会有arguments对象,它包含了所有的参数,arguments ...

  8. javascript下的arguments,caller,callee,call,apply示例及理解

    在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义.在提到上述的概念之 前,首先想说说javascript中函数的隐含参数:arguments Argument ...

  9. JavaScript中函数里的arguments属性

    <!DOCTYPE html> <html lang="en">     <head>         <meta charset=&qu ...

最新文章

  1. oracle 求A中不存在于B的记录
  2. HashMap内部结构深入剖析
  3. Xcode文件被锁定:The file .xcodeproj could not be unlocked
  4. 非科班出身获得软开职位
  5. css使用1-搜狐浏览器和chrome浏览器不同点记录
  6. 【TensorFlow】Anaconda下快速安装TensorFlow教程
  7. 苹果官方Instruments工具之Automation的介绍
  8. Objective-C NSFileManager 文件管理总结
  9. SAP CRM product hierarchy和category的三个问题问答
  10. centos7中无法确定光盘权限怎么办_图解KVM安装CentOS7.6操作系统
  11. mysql注入5.0以上_[Injection]对MYSQL 5.0服务器以上版本注入
  12. (译)如何使用GameCenter制作一个简单的多人游戏教程:第一部分
  13. Maven - 依赖冲突
  14. 计算机三级网络技术综合题解析,计算机三级网络技术上机考试习题答案及解析...
  15. 计算机下桌面图标点不开怎么办,我的电脑桌面图标程序都打不开怎么办?
  16. 微软并购雅虎案:世界商业三巨头的财智较量
  17. Lenient assertions(Unitils介绍三)
  18. 计算机网断IP修改,教你怎样更改电脑以太网的IP网段,网络设备必需品
  19. LOGO 8.3 Web Server功能
  20. download sources报错: Cannot connect to the Maven process. Try again later. If the problem persists

热门文章

  1. Spring事务处理流程和原理(动脑学院笔记)
  2. sql 2008数据库日志清理(转)
  3. Mysql foreignkey 相关
  4. Key-Value Store Indexer(Lily HBase Indexer) 小型采坑
  5. Solr嵌套子文档的弊端以及一种替代方式
  6. BZOJ 2073: [POI2004]PRZ( 状压dp )
  7. hdu 4417 划分树
  8. (正则表达式学习)正则表达式语法
  9. c语言 文件截断,c – 是否有一种正统的方法来避免编译器警告C4309 – “二进制文件输出的”常数值的截断“?...
  10. 【控制】二阶 UGV 的 时间-输入 指标性能最优解算