참조 자료형의 데이터는 동적(dynamic)으로 변한다.
참조 자료형을 변수에 할당할 경우, 데이터의 주소가 저장된다.
원시 자료형 또는 원시 자료형의 데이터를 함수의 인자로 전달할 경우, 값 자체의 복사가 일어난다.
사실 함수의 인자도 변수에 자료(data)를 할당하는 것이다.
함수를 호출하면서 넘긴 인자가 호출된 함수의 지역변수로 (매 호출 시마다) 새롭게 선언된다.
함수의 인자를 넣어두는건, 즉 매개변수 선언과도 같다. 그래서 위 코드는 할당이고, 아래 코드는 함수(year2) <- 인자로 매개변수를 선언하였기에 지역변수이므로 외부에서 내부로 접근할 수 없어졌기에 year2의 값은 그대로 2021이다!
this는 method를 호출하는 시점에 결정된다.
method는 '어떤 객체의 속성으로 정의된 함수'를 말한다.
위의 megalomaniac 객체를 예로 든다면,
getMembers는 megalomaniac 객체의 속성으로 정의된 함수인 '메소드'라고 할 수 있다.
megalomaniac.getMembers()와 같은 형태로 사용(호출)할 수 있다.
사실은, 전역 변수에 선언한 함수도 웹페이지에서 window 객체의 속성으로 정의된 함수라고 할 수 있다.
window. 접두사 없이도 참조가 가능하기 때문에(window.foo()라고 사용해도 된다.), 생략하고 쓰는 것뿐이다.
이렇듯, method는 항상 '어떤 객체'의 method 이다.
따라서 호출될 때마다 어떠한 객체의 method일 텐데, 그 '어떠한 객체'를 묻는 것이 this 이다.
예시로, obj이라는 객체 안에 foo라는 메서드를 선언하고, this를 반환한다고 했을 때 ( 예: let obj = {foo: function() {return this}}; )
obj.foo() === obj 이라는 코드에 true라고 반환할 것 이다.
this는 함수의 호출에 따라서 값이 달라지기도 한다.
그러나 화살표 함수는 다르다.
자신의 this가 없다.
화살표 함수에서의 this는 자신을 감싼 정적 범위(lexical context)이다. (전역에서는 전역 객체를 가리킨다.)
일반 변수 조회 규칙(normal variable lookup rules)을 따르기 때문에, 현재 범위에서 존재하지 않는 this를 찾을 때, 화살표 함수 바로 바깥 범위에서 this를 찾는다.
그렇기에 화살표 함수를 사용할 때, 이러한 특이점을 생각하고 사용해야 한다.
'Object.assign'을 통한 복사는 reference variable은 주소만 복사한다.
Object를 함수의 인자로 전달할 경우, reference가 전달된다.
마지막에 Array.isArray(argumentsObj) 가 왜 false인지 잘 이해해보기!
const[first, ...middle, last] = array 와 같은 문법은 사용할 수 없다! 할당하기 전 왼쪽에는, rest 문법 이후에 쉼표가 올 수 없다!!