Ich stieß auf diese beim Erstellen von Sortierschaltflächen für eine Datentabelle. Ich wollte jede Sortierschaltfläche haben, um zwischen einem DESC (Sortieren nach unten) und ASC (Sortieren nach oben) und inaktiv - der Standardsortierung umzuschalten. SoJavascript Object Assignment gottcha
Ich habe zwei Modelle ein derjenige sein würde, der als das Programm geändert Fortschritte gemacht und war ein Standard die Werte
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>
Dies liegt daran, dass Objekte per Referenz in JavaScript zugewiesen werden, d. H. Sie werden bei der Zuweisung nicht kopiert. Es ist ein weit verbreitetes Verhalten unter den bekannten Programmiersprachen, soweit ich weiß. –