今天学到了javascript的值传递,一句话,简直坑爹。
我已经忍了这个弱类型的程序语言一天半了,但今天下午实在是忍不了了(这个破语言,垃圾!),它竟然和其它的高级语言不一样,传值竟然传递的是地址值,你敢信!?
学它要颠覆我的认知,写下此贴,记录下我的吐槽,顺便给自己提个醒。
第一个代码:
因为函数传递的值实质上是地址值,所以在子函数 fn() 体内,变量a得到了obj的地址,此时对a.name的修改会传回主函数, 这也导致了 主函数上的obj.name的值的变化。
<script>
function fn(a)
{
document.write(a.name +"<br>"); //孙悟空
// a={};
a.name="猪八戒";
document.write(a.name +"<br>"); //猪八戒
}
let obj={name:"孙悟空"};
fn(obj);
document.write(obj.name +"<br>"); //猪八戒;注意,这里obj的值被修改了。
</script>
第二个代码:
这个代码仅仅比上一个代码多了一句:a={}; 这会新建一个对象,让变量a重新指向了一个新的地址值。这时,对a进行的一切操作与obj无关,所以主函数里的obj的值不会变化。
<script>
function fn(a)
{
document.write(a.name +"<br>"); //孙悟空
a={}; //关键点,这里变量a重新指向了一个新的地址值。
a.name="猪八戒";
document.write(a.name +"<br>"); //猪八戒
}
let obj={name:"孙悟空"};
fn(obj);
document.write(obj.name +"<br>"); //孙悟空; 注意,这里obj的值没有变。
</script>
第三个代码:
这个是C语言,函数传递的参数的值,不是地址值,因此在子函数里对变量a进行的一切修改不会影响主函数里的变量a。
#include<stdio.h>
#include<stdlib.h>
void func(int a)
{
a = 3;
printf("func里的a的值:%d \n", a); //func里的a的值:3
}
int main(){
int a = 4;
func(a);
printf("main里的a的值:%d", a); //main里的a的值:4
}
明确一下结论:JavaScript的函数的参数传递,传递的都是值,参数是 Object 类型的也一样,也是值,只不过这个值是地址值。
这与C,Visual Basic或Delphi等其他语言完全不同。再次强调,注意。