在C / C ++中,我知道我们有指向对象和数组的指针,因此可以将它们传递到函数参数中,而无需克隆所述对象和数组。在Javascript中,没有这样的选项,因此我们只使用object变量。
这是好习惯吗?
function setWhite(obj){
obj.color = "white";
}
var shirt = {
color: "red",
size: "L"
}
setWhite(shirt);
console.log(shirt);
答案 0 :(得分:1)
是的。在javascript中,对象是通过引用传递的。因此,如果您在函数内更改对象的值,它将在函数外更改它。
但是,如果您执行了以下操作,则情况并非如此:
function setWhite(obj){
obj = {
color: "white",
size: "M"
}
}
var shirt = {
color: "red",
size: "L"
}
setWhite(shirt);
console.log(shirt); // shirt will remain red / L
请注意,不同之处在于我正在obj
方法内重新分配setWhite()
,因此原始obj丢失了该功能。
这是一个很重要的概念,因为如果您不理会它,可能会造成令人不安的意外后果,不小心更改了您不想更改的对象的值,只是暂时操纵了其他数据目的。当您开始使用异步功能时,请务必记住这一点。异步功能在后台发生,您必须指定何时“等待”它们。如果您调用一个异步函数期望它更改您的对象值,但不等待它,则当您稍后在调用异步函数的代码中使用它们时,您的对象可能还没有更新的值。
类似地,如果您调用异步函数但不等待它,然后又更改了传入的对象,那么当异步函数使用该对象的值时,它们可能与您不同打算在您调用它时使用。