【问题标题】:Javascript Object Assignment gottchaJavascript 对象分配问题
【发布时间】:2016-08-10 00:20:26
【问题描述】:

我在为数据表构建排序按钮时遇到了这个问题。我想让每个排序按钮在 DESC(向下排序)和 ASC(向上排序)和非活动状态之间切换 - 默认排序。

所以我创建了两个模型,一个是随着程序的进行而改变的模型,一个是重置值的默认模型

var model = {
  order: {
    field: 'creationDate',
    direction: 'DESC'
  },
  orderDefault: {
    field: 'creationDate',
    direction: 'DESC'
  }
}

$('button').click(function() {
  if (model.order.field == "creationDate") {
    model.order.field = 'newField'
  } else if (model.order.direction == 'DESC') {
    model.order.direction = 'ASC'
  } else {
// This casuses the orderDefault object to be a clone of the order object
// so assignment of values in model.order are refelected in model.orderDefault GOTCHA!!!!
    model.order = model.orderDefault
  }
  $('#result').html('field:' + model.order.field + " direction:" + model.order.direction);
}
)
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<button class="btn btn-primary">
  click me
</button>

<div id="result">

</div>
因此,您将看到这一切都按预期工作,直到我们重置订单对象为止。我们第二次在代码中到达这一点时,您会看到它永远不会重置。似乎 orderDefault obj 成为 order obj 的别名。

【问题讨论】:

  • 这是因为在 JavaScript 中对象是通过引用分配的,即它们在分配时不会被复制。据我所知,这是流行编程语言中非常常见的行为。

标签: javascript object assignment-operator


【解决方案1】:

答案是,您需要分配 orderDefault 的值,而不是分配 orderDefault

所以不

model.order = model.orderDefault

但是

 model.order.direction = model.orderDefault.direction
 model.order.field = model.orderDefault.field

我希望这对某人有所帮助。

【讨论】:

  • 如果你的平台支持,可以使用Object.assign(model.order, model.orderDefault)。
  • 是的,我没有看到,谢谢,并且有一个适用于旧浏览器的 polyfill,所以这看起来是一个很好的解决方案。我发现有趣的是,使用 '=' 的赋值实际上并不是一个赋值,而是一个等价断言。因此,如果您更改了对象 A 中的属性 x,那么这将更改对象 B 中的属性 x。
  • 实际上是对对象的引用的赋值,而不是对象的值。 model.order = model.orderDefault 表示“name model.order 现在指向 model.orderDefault 的值”所以两个名称现在都指向同一个对象之后就没有A和B了,只有A。Java、Python等很多语言的行为都是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多