即使作为一个有点经验丰富的JS开发人员,我发现自己也常常对浅物和副物的副本感到惊讶.
当通过引用复制JavaScript值时,是否有任何经验法则,而不是主要对象类型的值?例如,我知道字符串值总是按值而不是引用复制.
在 JavaScript 中,所有对象都是“通过引用”存储和传递的。
var a = { v: 'a' }, b = { v: 'b' };
a=b;
b.v='c';
Run Code Online (Sandbox Code Playgroud)
a
并将b
引用同一个对象;a.v == 'c'
和b.v == 'c'
。
原始数据类型(string
、number
、boolean
、null
和undefined
)是不可变的;它们是按值传递的。
var a = 'a', b = 'b';
a=b;
b='c';
Run Code Online (Sandbox Code Playgroud)
由于我们正在处理原语,a == 'b'
并且b == 'c'
.
学究们会告诉你,JavaScript 并不是传统意义上的引用传递,或者说它是一种“纯粹的值传递”语言,但我认为这会使事情变得更加复杂。不,您不能直接修改传递给函数的参数,就好像它是一个变量一样(如果语言是真正的按引用传递,则这是正确的),但您也不会收到传递的对象的副本作为参数(如果它是真正的按值传递,就像您所做的那样)。对于大多数目的(从语言用户的角度来看,您),传递给函数的对象是引用,因为您可以修改该对象并且它会影响调用者的对象。另请参阅此问题的精彩答案。