关于js高级程序设计第三版中关于arguments论述的一个错误

絮凝派生
• 阅读 2755

关于js高级程序设计第三版中关于arguments论述的一个错误

这本红宝书相信大家很熟悉,甚至比我读过的次数要多,不过今天在阅读函数传参部分章节时,发现了书中一个可以算是小错误的知识点。

我们知道,arguments作为一个类数组,和函数的传参是一一对应的,那么如果改变其中一个的值,会对另一个有什么影响呢?

在红宝书第66页第一段,作者给予了论述:

   function doAdd(num1,num2){
    arguments[1]=10;
    alert(arguments[0]+num2)
   }

“每次执行这个doAdd()函数都会重写第二个参数,将第二个参数的值修改为10。因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1],也就修改了num2,结果它们的值都会变成10。不过,这并不是说读取这两个值会访问相同的内存空间;它们的内存空间是独立的,但它们的值会同步。但这种影响是单向的:修改命名参数不会改变argument中对应的值

这段解读非常深刻,于是我赶快打开编辑器进行尝试。我是这样做的:

function add1(num1,num2){
    arguments[1]=10;
    alert(num1+num2);
}
function add2(num1,num2){
    num2=10;
    alert(arguments[0]+arguments[1]);
}
add1(20,5);
add2(3,5);
add1(20);

这两个函数,分别对arguments[1]和其对应的传参num2做出修改,并弹出结果。在第一个函数中,因为给arguments[1]赋值这个动作将num2的值强行替换为10,所以在调用add1(20,5)时,我们得到的是num1+num2=20+10=30。这和书中论述无异。
然而在第二个函数add2中,将num2强行赋值为10,输出arguments[0]+arguments[1],按照作者以上的论述(斜体字部分),argument里的值应该保持不变,结果应该为3+5=8才对。但是浏览器结果最后给出的结果为13(3+10),在火狐、谷歌和IE下结果一致。这说明,改变传参的值,同样可以反过来改变对应arguments的值,两者的改变是相通的。

另外,如果只给add1传入一个参数,浏览器最后给出的结果为NaN,这说明:如果只传了一个值,那么为arguments[1]设置的值不会反应到命名参数中去,因为arguments对象的长度是由传入的参数个数决定的。此时num2的值始终为undefined,因此才会有输出NaN这一结果。

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
VUE2 源码中 一个有趣的小动画
今天在vue2源码发现了一个有意思的小动画,挺有趣的,用svg和Dynamics.js动画库完成,啥也不说,先看看效果一、看效果GIF2021319171028(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/96096e7bd88b170e5846ae09
九旬 九旬
3年前
函数参数传递
函数参数传递在JavaScript中函数传参,分为两种:基础类型(Number、String、Boolean..)引用类型(Object、Array、Funcion..)基础类型传参看下面的例子:js
梦
5年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
徐小夕 徐小夕
5年前
Canvas入门实战之用javascript面向对象实现一个图形验证码
本文主要介绍用canvas实现图形验证码的一些思路以及如何用javascript面向对象的方式更友好的实现canvas的功能,关于canvas的一些基本使用方法和API我整理了一个思维导图,大家感兴趣的可以参考学习。(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b158fad95
Wesley13 Wesley13
4年前
HTML+CS+JS的总结(PPT)
发现了一个关于HTMLCSJS总结比较好的ppt,截取下来与大家分享。!在这里插入图片描述(https://oscimg.oschina.net/oscnet/upec9cbcc91934d26fa0688ad853bd7240.png)!在这里插入图片描述(https://oscimg.oschina.net/oscnet/up
Wesley13 Wesley13
4年前
2018春,在实习面试过程中遇到的一些问题
在面试一家位于东单的公司的时候,遇到了这样一道关于IP地址的程序题。当时思路卡在了选用一种什么样的容器,既能够存储int型变量,又能够存储“."。今天在做PTA的程序设计题时,醒悟过来,可以使用scanf来处理这个”.”。具体用法是://如何忽略掉时间格式中12:35中的“:”。include<stdio.hi
Wesley13 Wesley13
4年前
JS 面相对象编程
提起面向对象我们就能想到类,对象,封装,继承,多态。在《javaScript高级程序设计》(人民邮电出版社,曹力、张欣译。英文名字是:ProfessionalJavaScriptforWebDevelopers)这本书中描述的还算比较详细。我们看看JavaScript中定义类的各种方法。1.工厂方式javaScript中创建自己的类和对象,我们应
Stella981 Stella981
4年前
JavaScript深入之参数按值传递
定义在《JavaScript高级程序设计》第三版4.1.3,讲到传递参数:ECMAScript中所有函数的参数都是按值传递的。什么是按值传递呢?也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。按值传递举个简单的例子:varvalue1;fun