По умолчанию $.extend
свойства только поверхностных копий *.Это не очень интересно.
В этом случае расширенными свойствами являются "0", "1", "2" и т. Д., И, таким образом, shat[0] === shot[0]
имеет значение true после расширения , что только , в случае, если оба оценивают один и тот же объект.Так как они - один и тот же объект, тогда ... ну, мутируя его в одном месте, мутирует его везде .
Чтобы разделить их, рассмотрим "глубокую копию" (см. Различные способы вызова)1017 * jQuery.extend ).Другой подход, о котором я упоминаю, поскольку он также может использоваться в других контекстах, заключается в сериализации объекта и последующей десериализации его - например, с помощью JSON.
var shat = [{bang:true}, {bumm: false}, {bong: false}]
var shot = [{bang:false}, {bumm: false}, {bong: false}]
$.extend(true, shat, shot) // use "deep copy"
shat[0] === shot[0] // false; different objects now so...
shot[0].bang = "boom" // ...this will not affect the object named by shat[0]
shot[0].bang // "boom"
shat[0].bang // false
Счастливое кодирование.
* То есть для каждого свойства, p
в исходном объекте (ах), оно просто делает target[p] = source[p]
.Помните, что в JavaScript массивы - это просто особый подтип объекта с магическим значением length
: значение в индексе n именуется свойством "n".