【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

回到顶部