Javascript 为什么';nt my js代码是否反映了正确的运行时值?
当我运行此代码时(在代码下) 在控制台中,我得到{a:0}Javascript 为什么';nt my js代码是否反映了正确的运行时值?,javascript,Javascript,当我运行此代码时(在代码下) 在控制台中,我得到{a:0} 为什么呢?我认为msg={a:1}
为什么呢?我认为
msg={a:1}如果您将代码更改为:
window.msg = { a: 0}
var b = window.msg;
function g()
{
console.log(b)
}
msg.a = 1; // this line is changed
g()
您将获得{a:1}
您正在重新分配msg
,因此b
只指向msg
的旧值
b
不引用window.msg
而是引用{a:0}
对象。您正在创建对象{a:0}
,并将对该对象的引用分配给msg
和b
。稍后,您将创建一个新对象{a:1}
,并将对该对象的引用分配给msg
,但b
仍在引用原始对象:
window.msg = { a: 0} // msg --> { a: 0 }, b --> undefined
var b = window.msg; // msg --> { a: 0 }, b --> { a: 0 }
msg = { a: 1}; // msg --> { a: 1 }, b --> { a: 0 }
g() // prints b --> { a: 0 }
如果我删除第一行怎么办?window.msg的值将是未定义的。但是b应该看到变化吗?@doomday1那么b
将始终是未定义的。关键是变量msg
和b
彼此独立。给一个赋值不会影响另一个。但是,如果它们都引用同一个对象,那么当您通过一个变量操纵该对象时(例如,msg.a=1
,如Doge的回答),您可以通过查看另一个变量看到该变化;i、 虽然变量本身是独立的,但引用的对象是相同的。用非常简单的术语来说:给变量赋值永远不会(真的,永远不会!)改变另一个变量的值。
window.msg = { a: 0} // msg --> { a: 0 }, b --> undefined
var b = window.msg; // msg --> { a: 0 }, b --> { a: 0 }
msg = { a: 1}; // msg --> { a: 1 }, b --> { a: 0 }
g() // prints b --> { a: 0 }