当通过引用而不是按值复制 JavaScript 值时,是否有任何经验法则
Are there any rules of thumb for when JavaScript values are copied by reference and not by value?
即使作为一个经验丰富的JS开发人员,我发现自己经常对对象的浅拷贝和深拷贝感到惊讶。
对于通过引用而不是按主要对象类型的值复制 JavaScript 值时,是否有任何经验法则?例如,我知道字符串值总是通过值而不是引用复制的。
在 JavaScript 中,所有对象都"通过引用"存储和传递。
var a = { v: 'a' }, b = { v: 'b' };
a=b;
b.v='c';
a
和 b
将引用同一对象; a.v == 'c'
和b.v == 'c'
.
基元数据类型(string
、number
、boolean
、null
和undefined
(是不可变的;它们是按值传递的。
var a = 'a', b = 'b';
a=b;
b='c';
由于我们正在处理原语,因此a == 'b'
和b == 'c'
.
学究们会告诉你,JavaScript不是经典意义上的按引用传递,或者它是一种"纯粹的按值传递"语言,但我认为这会使实际目的复杂化。 不,您不能直接修改传递给函数的参数,就好像它是变量一样(如果语言是真正的按引用传递,则为真(,但您也不会收到作为参数传递的对象的副本(就像如果它是真正的按值传递一样(。 对于大多数目的(从语言用户 u 的角度来看(,传递给函数的对象是引用,因为您可以修改该对象并且它会影响调用方的对象。 另请参阅此问题的精彩答案。
好的,让我解释一下你的代码:
var x, y;
x = { 'blah': 'foo' };
y = x;
x = { 'bar': 'bas' };
因此,您声明两个变量,然后将对象值分配给第一个变量:
x = { 'blah': 'foo' };
那么,这里会发生什么:
- 评估对象文本 -
{ ... }
- ,这将导致创建和初始化新的本机对象。 - 对此对象的引用被分配给变量
x
。
接下来,这一行
y = x;
只是将存储在x
中的引用复制到变量 y
中。现在,两个变量存储对对象的相同引用。
最后,这条线
x = { 'bar': 'bas' };
为变量 x
赋值。计算对象文本,导致创建/初始化另一个对象,并且对该对象的引用存储在x
中。
然而,变量y
仍然包含对第一个对象的引用。
相关文章:
- 比较sessionStorage值时,Javascript函数无法调用
- 比较两个值时出现JavaScript输出和控制流错误
- 使用javascript函数检索隐藏的文本值时出现对象HTMLinputElement错误
- 当使用javascript/jquery添加值时,html文本输入表显示不正确
- 当用户设置另一个选择值时,如何通过 Javascript 设置另一个选择值
- 使用 HTML 和 JavaScript 从表单访问值时返回 undefined
- 如何防止按钮在未选择值时提交表单.不使用javascript
- 为什么 Javascript 在变量赋值时将 null 转换为字符串
- 使用 php 和 javascript Ajax 发送复选框值时遇到问题
- 为JavaScript类属性赋值时出错
- 从表单javascript返回值时出现问题
- jQuery:Javascript抛出错误“;操作不安全”;设置值时
- 求和值时出现Javascript舍入问题
- JavaScript:如何在每次更新一些值时返回一个函数
- 使用Javascript从多个dropbox获取值时出现问题
- 当有空格或没有输入值时发出Javascript警报
- TypeError:分析隐藏值时,javascript中的循环对象值
- 在 JavaScript 中更改多个值时遇到问题
- 使用 Javascript,当 Javascript 创建值时,如何读取 标记中的内容
- 更改 HTMLDropDownListFor 值时 Javascript 未触发