며칠 전 면접 질문을 검색하다가 이 코드를 발견했는데, 실행해 보니 생각했던 것과는 전혀 다른 느낌이었습니다
var a = { n : 1 }; var b = a; a.x = a = {n : 2}; console.log(a.x); console.log(b.x);
출력 결과는 다음과 같습니다.
정의되지 않음
[객체 객체]
처음에는 명령문이 먼저 a에 {n : 2}를 할당한 다음 a.x에 {n : 2}를 할당해야 한다고 생각했습니다.
그런데 그게 아니어서 코드를 바꾸고 로그를 몇 개 추가했습니다
var test; var a = { get test () { console.log("call a get"); return test; }, set test (value) { console.log("call a set"); test = value; } } var test2; var b = { get test2 () { console.log("call b get"); return test2; }, set test2 (value) { console.log("call b set"); test2 = value; } } a.test = { n : 1 }; b.test2 = a.test; console.log("begin"); a.test.x = a.test = {n : 2};
이렇게 시작하면 이 과제가 수행하는 작업이 무엇인지 한눈에 알 수 있습니다.
명령문이 실행될 때 출력되는 로그입니다
먼저 get이 트리거된 다음 set이 트리거됩니다.
이 문장의 실행 순서는 왼쪽의 변수를 먼저 꺼낸 후 할당을 수행하는 것으로 추측됩니다. (이 문장을 실행하기 전에 먼저 개체 참조를 꺼낸 다음 오른쪽에서 할당을 수행하는 것입니다. 왼쪽으로)
위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다