2012-01-13 1 views
4

나는 샷으로 샷을 확장 중입니다. 연장 후, 왜 샷을 변경하면 샤트가 변경됩니까?jQuery는 객체 간의 참조를 만드는 것을 확장합니까?

var shat = [{bang:true}, {bumm: false}, {bong: false}] 
var shot = [{bang:false}, {bumm: false}, {bong: false}] 

$.extend(shat, shot) 

shot[0].bang = true 

console.log("shat", shat) 
// prints 
Object 
bang: true // why is this true? 
Object 
bumm: false 
Object 
bong: false 

shot [0] .bang = true 이후에 참조가 생성되거나 확장이 어떤 이유로 발생한다고 가정합니다. 문제는, 확장 후에 샷을 수정하고 싶지만, 물론 shat에 영향을 미치고 싶지는 않습니다. 왜 이런 일이 일어나고 있는지, 내가 그 일을 피하기 위해 할 수있는 일이 있으십니까? http://jsfiddle.net/yEnph/3/

답변

5

기본적으로 $.extend은 속성 *을 단순 복사합니다. 그것은별로 흥분하지 않습니다. 이 경우

는 확장 속성 등, "0", "1", "2"이고, 따라서 shat[0] === shot[0]는 연장 후 사실 모두 받는 평가할 경우 경우이다 같은 개체입니다. 그것들은 같은 대상 이니까 ... 음, 돌연변이로 인해 한 곳에서 돌연변이가 일어난다. .

별도로 유지하려면 "딥 복사본"을 고려하십시오 (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 

해피 코딩.


은 * 즉, 소스 객체 (들), 그것은 단지 target[p] = source[p] 않는 모든 속성 p위한 것이다. 자바 스크립트에서 배열은 마술적인 length을 가진 객체의 특별한 하위 유형이라는 것을 기억하십시오 : 색인 n의 값은 속성 "n"에 의해 명명됩니다.

+0

하지만 shat [1] === shot [1]도 마찬가지입니다. 그것을 설명하는 방법? –

+0

@GraceShao'shat [x] === shot [x]','x'는 확장 된 속성이었습니다 : 나는 "1"과 "2"라고 말해야했기 때문에 엉망이되었습니다. copied :) 당신은 대답에서 * 아주 정확합니다 * : 배열을 특별하게 취급하지 않습니다. 그러나'shat'과'shot'은 여전히 ​​두 가지 다른 객체입니다 :'shat'의 속성은'shot'의 속성으로 막 (overridden)되었습니다. –

+0

그것은 이해할 만하다 :-), 지금 나는 왜 여기에 뭔가를 할 때 어떤 문제도 없다는 것을 이해하려고 애 쓰고있다. http://jsfiddle.net/qnBmn/ – Hans

1

재미있는 것을 전혀, extend이 배열에 근무 알고하지 않았다 작동 :

는 jSfiddle 테스트 케이스를 참조하십시오.

두 개의 배열에 모두 동일한 객체에 대한 참조가 포함되어 있기 때문입니다.

http://jsfiddle.net/yEnph/4/

var a = { test: "one"}; 
var b = a; 

a.test="new"; 

alert(b.test); 

두 변수가 같은 개체에 대한 참조가 너무 객체를 편집하는 객체, 둘 참조를 업데이트있다 : 그것은이 "새로운"알려드립니다 것과 같은 이유이다.

+0

typeof shot이 (가) 객체를 말합니다 – Hans

+0

@marcel이 업데이트 됨 –

+0

괜찮 았지만 아무렇지도 않게 처리하고 있습니다. – Hans

2

jQuery 문서 http://api.jquery.com/jQuery.extend/에서 $ .extend는 Object augments 만 있지만 Array는 아닌 것처럼 보입니다. 이 예에서 변수 shat은 변경된 적이 없습니다.

+0

하지만 당신이 shot [0] .bang = true로 주석 처리하면 – Hans

+0

흥미 롭습니다! 'shat'은'shot'의 복사본입니다. 아직 생각 중 ... –

0

그냥 키를 촬영하는 경우 속성을 덮어 확장 : 배열은 단지 숫자 속성 이름과 객체

var a = { 
    hello: "kitty" 
}, 

b = { 
    hello: "world" 
} 

$.extend(a, b); 

console.log(a); 
//Object 
//hello: "world" 

때문에 등등 "hello"입니다 "0" 제외하고 같은 원리로 교체하고 있습니다.

shatshot의 개체를 가져 오므로 다시 작성되므로 원래 shat 개체가 손실됩니다. 따라서 shot의 객체를 수정하면 shat의 객체가 동일한 객체이기 때문에 객체가 수정됩니다.

관련 문제