스코프는 자바스크립트 변수에 대한 접근 권한을 정의하는 것이다
JS에서 변수는 전역 스코프 또는 지역 스코프에 속할 수 있다
전역 스코프에 속하는 변수는 전역 변수라고 부른다
전역 변수는 프로그램의 어디에서나 접근 가능하다
foo = "I'm Global Variable";
console.log(foo);
JS에서 var는 변수를 선언하는 데 사용하는 키워드다
변수를 어디에서 선언하든 변수 선언이 함수의 맨 앞으로 이동한다
이를 변수 호이스팅이라고도 한다
스크립트 실행 시 변수가 스크립트의 가장 마지막에 선언됐다고 하더라도 해당 선언 코드가 가장 마지막에 실행되는 것이 아니다
var 키워드에 관해 주목해야 할 핵심적인 사항은 해당 변수의 범위가 가장 가까운 함수 범위리는 것이다
다음 코드에서 scope2 함수는 insideIf 변수와 가장 가까운 함수 범위다
function scope2(print) {
if (print) {
var insideIf = '12';
}
console.log(insideIf);
}
scope2(true); // 12를 출력하며 오류가 발생하지 않음
function scope3(print) {
if (print) {
let insideif = '12';
}
console.log(insideIf);
}
scope3(true); // 오류 ReferenceError가 발생한다
JS에는 전통적인 언어와 다른 자료형이 있다
이러한 점이 등가 비교와 같은 것들에 어떤 식으로 영향을 미치는지 살펴보자
var is20 = false; // boolean
typeof is20; // boolean
var age = 19;
typeof = age; // number
var lastName = "Bae";
typeof lastName; // string
var fruits = ["Apple", "Banana", "Kiwi"];
typeof fruits; // object
var me = { firstName: "Sample", lastName: "Bae" };
typeof me; // object
var nullVar = null;
typeof nullVar; // object
var function1 = function() {
console.log(i);
}
type function1 // function
var blank;
typeof blank; // undefined
if (node) {
...
}
여기서 node는 변수다
해당 변수가 비었거나 null이거나 undefined이면 해당 변수는 false로 평가된다
다음은 일반적으로 사용되는 표현식 중 false로 평가되는 경우다 (falsy)
다음은 일반적으로 사용되는 표현식 중 true로 평과디는 경우다 (truthy)
"5" == 5 // true를 반환한다
"5" === 5 // false를 반환한다
자바와 같은 강한 타입 언어는 equals()를 사용해 두 객체가 동일한지 확인한다
JS에서 두 객체가 동일한지 확인하고자 우리는 간단히 == 연산자를 사용해볼까 하는 생각이 들 수 있다
JS에서 객체의 비교를 할 떄 == 연산자를 사용하면 두 객체의 메모리상 주소가 같은지 확인한다
이것이 대부분의 자바스크립트 애플리케이션이 lodash나 underscore와 같은 유틸리티 라이브러리를 사용하는 이유다
다음 예제에서 객체가 같은지 정확하게 비교하기 위해 각 속성을 비교한다
function isEquivalent(a, b) {
// 속성 이름 배열
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// 속성 길이가 다른 경우 두 객체는 다른 객체다
if (aProps.length !== bProps.length) {
return false;
}
for (const propName of aProps) {
if (a[propName] !== b[propName]) {
return false;
}
}
// 모든 것이 일치하면 두 객체는 일치한다
return true
}