这是一个比较奇怪的话题,实际应用上毫无作用,但是为了面试造航母,看看 对象的探讨
function fun1(p){
p.x = 2
}
var p1 = {}
fun1(p1) // 这时候的p1: {x:2}
function fun2(p){
p = 2
}
function fun5(p){
p.vv = 6
p = {ff:2}
p.qq = 3
}
fun2(p1) // 这时候的p1还是{x:2},并没有变成2
fun5(p1) // 这时候的p1是{x:2, vv: 6 },没有qq,ff属性
验证下结论,如果你往方法体内传一个对象,相当于传了一个地址, 形参的地址指向这个地址,你可以对地址空间的数据进行操作,但是你不能更改地址,比如fun2中,p = 2, 这时候,相当于形参p的地址发生了更改,不再指向实参对象地址,而是一个2。func5也是一样,把形参p的地址指向了一个新的对象地址,再更改和实参已经没关系了 方法
var p2 = function p22(){}
var p3 = ()=>{}
function fun3(p){
p.name = 'func3'
p.x = 2
}
fun3(p2) // 这时候p2.name还是p22,x = 2
fun3(p3) // 这时候p3.name还是p3,x = 2
理解上就是,方法也是对象,但是有特殊属性name,如果你改了name,相当于更改这个函数对象的值,这个根据上面的结论,是无法更改的。 基础类型
var p5 = '555'
function fun6(p){
p = 111
}
fun6(p2) // p5不变
基础类型就不用说了,形参就是个值,不是地址,怎么变都不影响。 综上,只要对象形参不更改值(不用=号),那形参会一直指向实参,属性更改都会映射到实参上
注意对象
对象的key如果是对象,会自动使用toString方法进行转换。
var a = {};
var o = {x:1};
a[o]=1;
a[{}] === 1; // 实际上Object.keys中是[OBJECT],所以都一样,a[{}]会是1