我正在观看JavaScript演讲,导师说如果我们在函数中传递对象的属性,它实际上会改变实际值,因为我们将通过引用传递变量。这是幻灯片:
但是当我尝试练习这个概念时,情况并非如此。这是我的代码:
var obj = {val: 5};
function changeVal(x) {
x = x+5;
return x;
}
console.log(obj.val) // 5
console.log(changeVal(obj.val)) // 10
console.log(obj.val) // 5
我期待obj.val改为10。 请告诉我这里有什么问题,如果我错了,请纠正我。感谢
答案 0 :(得分:1)
您传递的不是对象,而是传递基本类型。因此,当您传递val
的{{1}}时,它是一个数字且是原始类型。它复制 val 并传递副本对象。
如果你像这样通过,它会起作用
obj
答案 1 :(得分:1)
你实际上并没有传递一个对象,只是传递了property(val)的值。 如果你将在changeVal()中传递 obj ,那么它实际上会改变传递对象的属性值。
为此您需要这样做:
var obj = {val: 5};
function changeVal(x)
{
x = x+5;
return x;
}
console.log(obj.val); // 5
changeVal(obj); // Need to pass object instead of value of the property's value
console.log(obj.val); // 10
答案 2 :(得分:0)
原始类型(字符串,整数,布尔值等)是不可变的,这意味着如果更改函数内的其中一个值,则被调用者(调用函数的作用域)将不会看到更改。
function doSomething(a) {
a = a + 1;
}
var value = 2;
console.log(value); // result: 2
doSomething(value);
console.log(value); // result: 2
Pass-by-reference仅适用于对象。像这样:
function doSomething(obj) {
obj.attribute = obj.attribute + 1;
}
var myObject = {attribute: 2};
console.log(myObject.attribute); // result: 2
doSomething(myObject);
console.log(myObject.attribute); // result: 3
有关Javascript类型的更多阅读: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
答案 3 :(得分:0)
比如说你有一部Iphone。现在让我们假设一家制造公司打电话给您并要求借用您的Iphone作为参考,这样他们就可以设计出类似的Iphone并将其卖给客户。您的原始Iphone仍然存在并且永远不会消失,但工厂偶尔需要使用它作为参考,将您的功能视为仅制作obj
副本的工厂。
//Original data
var obj = {val: 5};
一旦你的函数返回一些东西,它在技术上就会变成一个值
示例:
return 3; is a value of 3
所以
function changeVal(x) {
x = x+5;
return x;
}
是x的新值,在这种情况下是x + 5;
x是您传入函数的任何内容的副本。
希望这有帮助。