웹/공부

YOU DON`T KNOW JS(타입과 문법, 스코프와 클로저) : 1

User50 2022. 4. 18. 17:48
반응형

해당 글은 'YOU DON`T KNOW JS(타입과 문법, 스코프와 클로저)' 라는 책을 읽으며

나름의 정리를 하는 글입니다.

 

 

 

 

 

* ECMA 표준 명세서 5.1(이하 ES5)에서 정의한 타입

  - http://www.ecma-international.org/ecma-262/5.1 참조

  - 이 명세에 수록된 알고리즘에서 사용되는 모든 값은 이 절에서 정의한 타입 목록 중 하나에 해당한다.

    타입은 ECMAScript 언어 타입과 명세 타입으로 하위 분류된다.

  - 프로그래머가 ECMAScript 언어를 이용하여 직접 조작하는 값들의 타입이 바로 ECMAScript 언어 타입이다.

    ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Number, Object가 있다.

 

* 명세의 대략적인 정의를 따르자면(명세에 선택된 단어를 따라가는 것과 같다), '타입'이란 자바스크립트 엔진, 개발자 모두에게 어떤 값을 다른 값과 분별할 수 있는, 고유한 내부 특성의 집합

 

* 자바스크립트에는 7가지 내장 타입이 있음.

  - null

  - undefined

  - boolean

  - number

  - string

  - object

  - symbol(ES6부터 추가)

  이 중 object를 제외한 이들을 '원시 타입(Primitives)'이라 한다.

 

* 값의 타입은 typeof 연산자로 알 수 있지만 null 타입은 다름.

typeof null === "object" // true

  null을 반환했으면 좋겠지만 거의 20년 동안 사용해와서 이제와 손을 대자니 다른 버그가 생겨 잘 돌아가던

  웹 소프트웨어가 멈춰버릴 경우가 너무 많아 앞으로도 해결될 가능성은 좀처럼 없어 보임.

  그래서 null 타입 값을 정확히 확인하려면 조건이 하나 더 필요함.

var a = null;
(!a && typeof a === "object"); // true

  null은 'falsy'한 유일한 원시 값이지만, 타입은 object인 특별한 존재임.

더보기

truthy/falsy는 각각 true/false 뒷부분에 y를 붙여 변형한 형태로 '~스럽다'는 의미의 영어 특유의 뉘앙스가 있습니다.
이 단어를 많은 자바스크립트 도서에서 '참 같은 참', '거짓 같은 거짓', '참스러움', '거짓스러움'등으로 번역했는데, 제 생각에는 truthy/falsy 역시 자바스크립트의 예약어처럼 true/false와 동일한 레벨에서 원어를 있는 그대로 표기하는 편이 독자가 의미를 받아들이는데 도움이 될 것 같습니다.
true/false를 일일이 참/거짓이라고 옮기지 않는 것과 같은 이치며, '불리어 문맥 상 true/false로 봐야 하는' 값으로 이해하기 바랍니다.

 

  typeof가 반환하는 문자열은 하나 더 있음.

typeof function a(){...} === "function"; // true

  반환 값을 보면 마치 function이 최상위 레벨의 내장 타입처럼 보이지만 명세를 읽어보면 실제로는 object의

  '하위 타입'이며, '호출 가능한 객체(Callable Object)(내부 프로퍼티 [[Call]]로 호출할 수 있는 객체)'라고 명시되어 있음.

 

  배열의 typeof 반환 문자열은 object이며 객체의 '하위 타입'이라 할 수 있음.

typeof [1, 2, 3] === "object"; // true

 

* 자바스크립트는 '타입 강제(Type Enforcement)'를 하지 않음.

  값에는 타입이 있지만, 변수에는 타입이 없음.

  변수값이 처음에 할당된 값과 동일한 타입일 필요는 없음.

 

* typeof 연산자의 반환 값은 언제나 문자열임.

 

* 값이 없는 변수의 값은 undefined이며, typeof 반환 문자열은 "undefined"임.

var a;
typeof a; // "undefined"

var b = 42;
var c;
b = c;
typeof b; // "undefined"
typeof c; // "undefined"

  "undefined(값이 없는)"와 "undefined(선언되지 않은)"를 동의어처럼 생각하기 쉬우나, 둘은 전혀 다름.

  "undefined(값이 없는)"는 접근 가능한 스코프에 변수가 선언되었으나 현재 아무런 값도 할당되지 않은 상태.

  "undefined(선언되지 않은)"는 접근 가능한 스코프에 변수 자체가 선언조차 되지 않은 상태.

var a;
a; // undefined
b; // Uncaught ReferenceError: b is not defined

  위 브라우저 에러 메시의 "b is not defined"란 말은 결국 "b is undefined"란 말과 같아보이나

  "undefined"와 "is not defined"는 의미가 완전히 다름.

 

  선언되지 않은(undeclared) 변수의 typeof 연산 결과는 더 헷갈림.

var a;
typeof a; // "undefined"
typeof b; // "undefined"

  선언되지 않은 변수도 typeof 하면 브라우저는 오류 처리를 하지 않고 "undefined"로 나옴.

  이것이 바로 typeof만의 독특한 안전 가드(safety guard)임.

반응형