bar = 10
procedure foo(barArg):
barArg = 20;
end
foo(bar)
// foo内部改变值不会影响内部的bar的值
print(bar) // 10
// 注:以下都是伪代码,不是JS实现
bar = {
x: 10,
y: 20
}
procedure foo(barArg, isFullChange):
if isFullChange:
barArg = {z: 1, q: 2}
exit
end
barArg.x = 100
barArg.y = 200
end
foo(bar)
// 按值传递,外部的对象不被改变
print(bar) // {x: 10, y: 20}
// 完全改变对象(赋新值)
foo(bar, true)
//也没有改变
print(bar) // {x: 10, y: 20}, 而不是{z: 1, q: 2}
procedure foo(barArg, isFullChange):
if isFullChange:
barArg = {z: 1, q: 2}
exit
end
barArg.x = 100
barArg.y = 200
end
// 使用和上例相同的对象
bar = {
x: 10,
y: 20
}
// 按引用调用的结果如下:
foo(bar)
// 对象的属性值已经被改变了
print(bar) // {x: 100, y: 200}
// 重新赋新值也影响到了该对象
foo(bar, true)
// 此刻该对象已经是一个新对象了
print(bar) // {z: 1, q: 2}
procedure foo(barArg, isFullChange):
if isFullChange:
barArg = {z: 1, q: 2}
exit
end
barArg.x = 100
barArg.y = 200
end
//还是使用这个对象结构
bar = {
x: 10,
y: 20
}
// 按贡献传递会影响对象
foo(bar)
// 对象的属性被修改了
print(bar) // {x: 100, y: 200}
// 重新赋值没有起作用
foo(bar, true)
// 依然是上面的值
print(bar) // {x: 100, y: 200}
obj->x instead of (*obj).x
var foo = {x: 10, y: 20};
var bar = foo;
alert(bar === foo); // true
bar.x = 100;
bar.y = 200;
alert([foo.x, foo.y]); // [100, 200]
foo value: addr(0xFF) => {x: 100, y: 200} (address 0xFF) <= bar value: addr(0xFF)
bar = {z: 1, q: 2};
alert([foo.x, foo.y]); // [100, 200] – 没改变
alert([bar.z, bar.q]); // [1, 2] – 但现在引用的是新对象
foo value: addr(0xFF) => {x: 100, y: 200} (address 0xFF)
bar value: addr(0xFA) => {z: 1, q: 2} (address 0xFA)