짧지 않았던 3번째 챕터인데 깊은 내용은 후반부에 다룬다는 부분이 많았다. 전반적으로 살펴보는 느낌으로 읽으면 좋을 것 같다.
Chapter 3 타입1, 값, 변수 Types, Values, and Variables
이 챕터에서는 다음 세가지에 대해 심층적인 설명을 다룸.
- 타입 : 문자열, 숫자, 객체 등 값이 어떤 형태의 자료인지를 의미
- 값 : 3.14, “Hello World” 실제 저장되는 정보
- 변수 : 값을 나중에 사용하기 위해 이름으로 저장해두는 공간
3.1 숫자
64비트 부동 소수점 포맷
- 정수 문자열 : 10진수(
255
), 16진수(0xff
), 8진수(0377
) - 부동 소수점 문자열 :
[digits][.digits][(E|e)[(+|-)]digits]
- 계산 : +, -, *, /, % and
Math
object (p.33) - 무한대 :
-Infinity
,Infinity
, negative 0 (but0 == -0 => true
) NaN
: Not-a-number value. 0으로 나누기 등 에러가 발생하는 계산에서 나타나는 값 (비교연산자 못씀.isNaN()
)- 다른 프로그래밍 언어처럼 부동 소수점 처리에 문제가 있으므로 정수 영역으로 쓸 것
- 일자와 시간 :
Date
object (p.35),new Date().getTime()
. 숫자처럼 비교 가능한 객체
3.2 텍스트
- 불변(배열같이 0부터 인덱싱), 16비트, 유니코드
- ” 또는 “”, 개행 또는 이스케이프 시 \ 사용 (p.37, 38)
- 텍스트 메소드 p.38~
- 정규표현식 :
/hello/g.test("hello world")
(챕터 10)
3.3 불린값 Boolean Values
true
또는false
undefined
,null
, ``,-0
,NaN
,""
=>false
3.4 null
과 undefined
undefined
: 시스템 레벨, 예측할 수 없어서 마치 에러같은 빈 값, TypeErrornull
: 프로그램 레벨, 일반적 또는 예측 가능한 형태로의 빈 값, no object as an object==
로는 같으나(false
이므로)===
로는 다름
3.5 전역객체 The Global Object
JavaScript 해석기(interpreter)가 실행될 때 선언됨 (새로고침하거나.. 할 때 항상)
- 전역 프로퍼티 :
undefined
,Infinity
,NaN
- 전역 함수 :
isNaN()
,parseInt()
,eval()
- 생성자 함수 :
Date()
,RegExp()
,String()
,Object()
- 전역 객체 :
Math
,JSON
웹브라우저에서는 window
, 콘솔에서는 global
3.6 레퍼 객체 Wrapper Objects
기본형 primitive value인 경우 프로퍼티를 가질 수 없으므로 그런 경우 레퍼 객체를 활용할 수 있음. OO로 개발할 때 도움. (Java의 레퍼 클래스와 비슷한듯)
var s = "test", d = new String("test");
s.len = 4, d.len = 4;
console.log(s.len, d.len); // undefined 4
String()
,Number()
,Boolean()
3.7 변하지 않는 기본형과 변하는 객체 참조 Immutable Primitive Values and Mutable Object
References
- 기본형과 객체의 기본적인 차이인 불변성. 객체는 값이 아닌 참조가 들어있기 때문.
- 객체를 비교하거나 복사할 때는 유의해야 함. (비교 코드 예시 p.45)
3.8 타입 변환
JavaScript에서의 타입 변환은 완전 유연
-
true
로 변하는 값,false
로 변하는 값 -
타입 변환 표 p. 46
-
비교할 때 타입 변환을 고려할지 안할지.
==
,===
-
명시적 변환 : 레퍼 객체 또는
x + ""
,+x",
!!x` 활용 -
진수 변환, 정수 또는 소수 등 parsing
parseInt()
,(320.329).toFixed(2)
-
3.8.3 객체를 기본형으로 변환 :
valueOf()
=>toString()
=>TypeError
-
객체-숫자 변환과 객체-텍스트 변환 두가지로 문제 발생할 수 있음 typeof(new Date() + 1) // => “string”
typeof(new Date() – 1) // => “number”
typeof(+new Date() + 1) // => “number”
3.9 변수 선언
var
로 선언 : 타입이 따로 지정되지 않음.- 중복 선언해도 에러 발생 안함. 선언 안하면 에러남.
- 항상
var
사용하는걸 권장. => 3.10.2
3.10 변수 스코프 Variable Scope
-
프로그램 소스코드에서 선언한 변수를 사용할 수 있는 범위. 전역 변수는 전역 스코프를 가짐.
-
함수 스코프와 호이스팅 Hoisting
— C에서는
{ }
기준의 block scope지만 js에서는 함수 기준의 스코프— 함수 중간에
var
로 변수선언이 있으면 함수 실행 시 처음에 다 선언처리함 (hoisted) -
프로퍼티로서의 변수 :
var
로 선언하면 삭제 불가능한 프로퍼티로 생성 -
스코프 체인
— 변수 확인할 때 스코프 내에 선언되지 않은 경우 상위 스코프로 계속 이동하며 찾음. 끝까지 없으면
ReferenceError
— 함수 내에 함수를 선언 했을 때
—
with
5.7.1, 클로저의 이해 8.6 참고
프로그래밍 서적에서는 흔히 type을 형으로 번역하는데 그냥 영어로 적는다. ↩