【Web前端问题】高程66页里面说函数的参数num2和argument[1]是不同的内存空间,为什么我的试验不支持这个结论。
function doadd (num1,num2){
arguments[1] = [1,2];
console.log(arguments[1]===num2)
}
首先说一下为什么会得出他们两个是不同的空间,因为只传入一个参数的话doadd(5)
,num2是undefined,arguments[1]是[1,2],所以肯定是不同空间
但是,倘若是不同空间的话,'doadd(5,[1,2])'为什么会输出true,也就是arguments[1]===num2也就是他们的指针相同,也就是指向一个空间[1,2]呀?
补充:我们知道[1,2]===[1,2]===>false 因为它们的堆内存不同
现在arguments[1]===num2 为true 就证明它们是指向同一个堆内存,那么高程这句话就有问题
回答:
js里有没有内存模型抽象,不要把静态语言的那些概念套到js里
用内存模型帮助理解可以,不要硬套,你说的高程是指哪本书?
回答:
既然是实验,当然要多举点例子了,更何况你还举了[1,2]
这么个特殊的
function doadd (num1,num2){ arguments[1] = [1,2];
console.log(arguments[1], num2)
}
doadd(5,[1,2,3]); //[1, 2] [1, 2]
doadd(5,1); //[1, 2] [1, 2]
doadd(5); //[1, 2] undefined
如果实参和形参数量相等,那么形参和argments之间有种映射关系:形参变量值改变对应位置的arguments[i]也随之改变,反之亦然。
如果实参比形参少,那么多余的形参和argments之间就没有了映射关系。即多余形参值得改变,对应位置的arguments[i]的值仍为undefined,反之亦然。
另外,[1,2]
是不等于[1,2]
的,你实验的相等是因为num2的[1,2]
被替换成了argments[1]的[1,2]
回答:
看下面代码:
let arr1 = [1, 2];let arr2 = arr1;
console.log(arr1===arr2)//true
arr1和arr2是在不同的内存空间,引用同一个数组。
这个和你说的情况应该是一样的。
C++中的指针,JAVA中的引用传递和值传递,都是类似的概念。
借用C++指针的概念来描述一下,可能更好理解,如下图
arr1的在内存中是0x2143123,arr2的在内存中是0xa33234,
arr1 === arr2是因为他俩的值都是0x123412,但是他俩的确在不同的内存空间。
正如num1=1,num2=1,
num1 === num2//true。
解释的可能不是特备好,有不正确的地方请指出。
以上是 【Web前端问题】高程66页里面说函数的参数num2和argument[1]是不同的内存空间,为什么我的试验不支持这个结论。 的全部内容, 来源链接: utcz.com/a/143192.html