JAVA에서의 '=='연산자는 매우 엄격했다. 자료형이 다르면 절대로 그 값을 내보내주지 않았으니 말이다.
그런데 JS는 자료형이 다르더라도 사람이 보기에 똑같은 것을 같은 것이라 판단하기 시작했다! 이로 인해서 생기는 이점도 분명히 존재하지만, 특수한 상황에서 생기는 맹점도 분명히 존재한다.
그걸 해결하기 위해 JS에서는 '==='를 지원한다. JAVA의 '=='라고 생각하면 편하다.
var a = [1,2,3];
var b = '2';
console.log(a[1] == b);
// true
console.log(a[1] === b);
// false
JAVA에서 산술연산자와 비교연산자는 함께하지 못했다. JS에서는 그들을 안타깝게 여겼으며, 그들이 서로 손을 잡을 수 있도록 허락했다.
0을 제외한 모든 숫자는 true라고 여겨졌고, 그 논리를 가지고 AND와 OR을 판단해 그 값을 산술연산자와 함께 버무린다.
var i =
(2 * (1 > 2)) // 2 * 0(1>2는 false == 0)
+ ((0 || 10)
// 0==false므로 제외, or은 둘중 하나만 true면 되는데,
// 0을 제외한 모든 값은 true로 인식하므로 10을 return
* (10 && 0))
// 앞의 10이 true, 그러나 and는 둘다 true여야 하므로
// false==0을 return
console.log(i);
// 결과 : (2x0) + (10x0) = 0
for(var key in obj) {
console.log(key, obj[key]);
//obj의 key값과 obj[key]의 value값
}
for(var k of Object.keys(obj)) {
console.log(k);
//배열형으로 변환한 obj의 값
//(keys:키, values:밸류, entries:키+밸류)
}
기본적인 개념은 이렇다. 그렇다면 왜 for of가 더 효율적인가? 값을 가져올 때 obj전체가 아닌 특정 부분만 받아와서 그런가? 구조적인 문제라는데, 시간 나면 더 알아보도록 하자.
var : 함수 안에서 생성될때만 지역변수로 사용된다.
let : 중괄호 안에 들어있으면 지역변수로 사용된다.
const : 상수로 사용된다.
JS에서는 변수 앞에 자료형을 입력해주지 않아도 잘 동작한다. 그러나 그렇게 되면 중복되는 변수 선언에도 오류가 생기지 않거나 중괄호나 함수 안에서 선언한 변수라도 외부에 영향을 미치게 되고, 중요한 변수에 영향을 미칠 가능성이 있다.
이를 방지하기 위해 변수 선언시 변수의 용도에 따라 적절하게 선언해 주도록 하자.
JAVA에서 this는 멤버변수에 인스턴스 생성시 입력한 파라미터값을 넣어야 할 때 사용되었다.
JS에서는 함수가 어떻게 호출되었느냐에 따라서 this에 들어갈 값이 달라진다. 이게 어떻게 활용되는가는 아직 구체적으로 감이 잡히질 않는다. 일단... 기억은 해 놓도록 하자.
JavaScript의 this
(function(x) {
console.log(x*x);
})(x);
//함수의 이름이 필요하면 기명, 아니면 익명.
//변수에 담아도 된다.
주로 내부의 변수가 외부에 영향을 미치지 않아야 할 때 사용한다. 전역 변수를 따로 생성해줄 필요가 없고, 때문에 전역 변수와 충돌할 가능성이 없어져 안정성이 높다. 아래 closure을 통해 무언가를 만들때 사용하면 좋다.
즉시실행함수 설명
외부 함수의 지역변수를 내부 함수에서 사용하면 가비지 컬렉터가 외부 함수의 메모리 할당을 해제 수 없다.
이를 활용하여 프로그램이 완전히 종료되기 전까지 값이 메모리 상에서 초기화되지 않고 유지할 수 있도록 한다. 함수형 언어의 특징이며, 웹에서는 반응형 요소를 만드는데 유용하게 사용할 수 있다.
closure의 기본 개념
closure에 대해 강의를 들으면서 들었던 생각이 사용하지 않을때에도 메모리에서 해제되지 않아 생길 메모리 누수였다.
해결 방법은, 쓸모가 없어진 closure을 담고있는 객체를 초기화 시켜버리는 것이다.
closureVar = null;