JS 函数的按值传递

来源:互联网 发布:汉朝历史 知乎 编辑:程序博客网 时间:2024/06/05 02:47

学过又忘了,于是网上搜了一下,发现网上很多都说得不够具体,于是翻了下红宝书,现在算是明白了(希望别忘得太快= _=!!)!

个人比较水,还是拿网上网友的例子来说吧,毕竟问题是从这里开始。

function changeObj(o) {        o.name = "changeobj";    }    var p = {};    changeObj(p);    console.log(p.name);    var o = {        name: 'tt'    }
这里应该没什么问题了,因为在JS中,所有函数的参数都是按值传递(ECMAScript中规定的),不过传递的参数类型分为基本数据类型和引用类型。

基本数据类型包括:Undefined,String,Number,Null,Boolean;引用类型为:Object,Array,Function

基本数据类型的传参是将变量复制一个副本,然后赋值到另一个变量,两个变量之间没有联系;而当一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到新变量分配的空间中。这个值的副本实际上是一个指针,而这个指针指向存储在堆对象中的一个对象。复制结束后,两个变量实际上引用的是同一个对象。

var o = {        name: 'tt'    }    var b = new Object();    b.name = 'b';    o = b;    console.log(o.name);
这里也能理解了,这里创建了一个对象o,然后创建了对象b,并为b添加name属性,接着把b赋值给o(这里o引用的是b的地址,所以打印结果是‘b’);

function quoteFn(obj) {        var o = new Object();        obj = o;        obj.name = "tony";        obj.age = 24;        obj.sex = "Men";    }    var person = {        name: "miracle",        age: 12    }    console.log(person.name);    console.log(person.age);    console.log(person.sex);
一开始让我懵逼的地方来了,这里比较难理解的地方是红色加粗字体部分,一开始总以为和上面两段代码一样,quoteFn传入person作为参数,运行之后打印出来的结果是quoteFn里面修改后的结果,但是结果不是我想象的那样。

这是因为var o = new Object()这里创建了新对象o,此时o已经在内存中生成一个地址了,obj = o 让obj指向了新创建的对象o,所以跟原来传入person的时候指向的不是同一个地址(一开始还以为是作用域问题),最后打印出来的结果是“miracle”,“12”,“undefined”。

0 0